Base class for providing scheduling in virtual time. This inherits from the Rx.Scheduler
class.
The following shows an example of using the Rx.VirtualTimeScheduler
. In order for this to work, you must implement the add
, toAbsoluteTime
and toRelativeTime
methods as described below.
/* Comparer required for scheduling priority */
function comparer (x, y) {
if (x > y) { return 1; }
if (x < y) { return -1; }
return 0;
}
var scheduler = new Rx.VirtualTimeScheduler(0, comparer);
/**
* Adds a relative time value to an absolute time value.
* @param {Any} absolute Absolute virtual time value.
* @param {Any} relative Relative virtual time value to add.
* @return {Any} Resulting absolute virtual time sum value.
*/
scheduler.add = function (absolute, relative) {
return absolute + relative;
};
/**
* Converts an absolute time to a number
* @param {Number} The absolute time in ms
* @returns {Number} The absolute time in ms
*/
scheduler.toAbsoluteTime = function (absolute) {
return new Date(absolute);
};
/**
* Converts the time span number/Date to a relative virtual time value.
* @param {Number} timeSpan TimeSpan value to convert.
* @return {Number} Corresponding relative virtual time value.
*/
scheduler.toRelativeTime = function (timeSpan) {
return timeSpan;
};
// Schedule some time
scheduler.scheduleAbsolute(null, new Date(1), function () { console.log('foo'); });
scheduler.scheduleAbsolute(null, new Date(2), function () { console.log('bar'); });
scheduler.scheduleAbsolute(null, new Date(3), function () { scheduler.stop(); });
// Start the scheduler
scheduler.start();
// => foo
// => bar
// Check the clock once stopped
console.log(scheduler.now());
// => 3
console.log(scheduler.clock);
// => 3
File:
Dist:
Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.
initialClock
(Function): Initial value for the clock.comparer
(Function): Comparer to determine causality of events based on absolute time.
function comparer (x, y) {
if (x > y) { return 1; }
if (x < y) { return -1; }
return 0;
}
var scheduler = new Rx.VirtualTimeScheduler(
0, /* initial clock of 0 */
comparer /* comparer for determining order */
);
Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.
time
(Any): Relative time to advance the scheduler's clock by.
var scheduler = new MyVirtualScheduler(
200 /* initial time */
);
scheduler.scheduleAbsolute(null, 250, function () {
console.log('hello');
});
scheduler.advanceBy(300);
// => hello
console.log(scheduler.clock);
// => 500
Advances the scheduler's clock to the specified time, running all work till that point.
time
(Any): Absolute time to advance the scheduler's clock to.
var scheduler = new MyVirtualScheduler(
0 /* initial time */
);
scheduler.scheduleAbsolute(null, 100, function () {
console.log('hello');
});
scheduler.scheduleAbsolute(null, 200, function () {
console.log('world');
});
scheduler.advanceBy(300);
// => hello
// => world
console.log(scheduler.clock);
// => 300
Schedules an action to be executed at dueTime.
state
: (Any): State passed to the action to be executed.dueTime
(Any): Absolute time at which to execute the action.action
:Function
: Action to execute with the following arguments:scheduler
:Scheduler
- The current Schedulerstate
:Any
- The current state
(Disposable): The disposable object used to cancel the scheduled action (best effort).
var scheduler = new MyVirtualScheduler(
0 /* initial time */
);
scheduler.scheduleAbsolute('world', 100, function (scheduler, state) {
console.log('hello ' + state);
});
scheduler.scheduleAbsolute('moon', 200, function (scheduler, state) {
console.log('goodnight ' + state);
});
scheduler.start();
// => hello world
// => goodnight moon
console.log(scheduler.clock);
// => 200
Schedules an action to be executed at dueTime.
state
: (Any): State passed to the action to be executed.dueTime
(Any): Relative time after which to execute the action.action
:Function
: Action to execute with the following arguments:scheduler
:Scheduler
- The current Schedulerstate
:Any
- The current state
(Disposable): The disposable object used to cancel the scheduled action (best effort).
var scheduler = new MyVirtualScheduler(
0 /* initial time */
);
scheduler.scheduleRelative('world', 100, function (scheduler, state) {
console.log('hello ' + state);
});
scheduler.scheduleRelative('moon', 200, function (scheduler, state) {
console.log('goodnight ' + state);
});
scheduler.start();
// => hello world
// => goodnight moon
console.log(scheduler.clock);
// => 300
Advances the scheduler's clock by the specified relative time.
time
(Any): Relative time to advance the scheduler's clock by.
var scheduler = new MyVirtualScheduler(
0 /* initial time */
);
scheduler.sleep(400);
console.log(scheduler.clock);
// => 400
Starts the virtual time scheduler.
var scheduler = new MyVirtualScheduler(
0 /* initial time */
);
scheduler.scheduleRelative('world', 100, function (scheduler, state) {
console.log('hello ' + state);
});
scheduler.scheduleRelative('moon', 200, function (scheduler, state) {
console.log('goodnight ' + state);
});
scheduler.start();
// => hello world
// => goodnight moon
console.log(scheduler.clock);
// => 400
Stops the virtual time scheduler.
var scheduler = new MyVirtualScheduler(
0 /* initial time */
);
scheduler.scheduleRelative('world', 100, function (scheduler, state) {
console.log('hello ' + state);
});
scheduler.scheduleRelative(null, 100, function (scheduler, state) {
scheduler.stop();
});
scheduler.scheduleRelative(null, 100, function (scheduler, state) {
console.log('goodbye cruel ' + state);
});
scheduler.start();
// => hello world
Adds a relative time value to an absolute time value. This method is used in several methods including scheduleRelative
, advanceBy
and sleep
.
absolute
(Any): Absolute virtual time value.relative
(Any): Relative virtual time value.
(Any): Resulting absolute virtual time sum value.
One possible implementation could be as simple as the following:
scheduler.add = function (absolute, relative) {
return absolute + relative;
};
Converts an absolute time to a number. This is used directly in the now
method on the Rx.Scheduler
absolute
(Any): The absolute time to convert.
(Number): The absolute time in ms.
One possible implementation could be as simple as the following:
// String -> Number
scheduler.toAbsoluteTime = function (absolute) {
return absolute.length;
};
Converts the time span number/Date to a relative virtual time value.
timeSpan
(Any): The time span number value to convert. This is used directly inscheduleFuture
.
(Number): Corresponding relative virtual time value.
One possible implementation could be as simple as the following:
// Number -> Number
scheduler.toRelativeTime = function (timeSpan) {
return timeSpan;
};