Rx.VirtualTimeScheduler
class
Base class for providing scheduling in virtual time. This inherits from the Rx.Scheduler
class.
Usage
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
Location
File:
Dist:
VirtualTimeScheduler Constructor
VirtualTimeScheduler Instance Methods
VirtualTimeScheduler Instance Properties
VirtualTimeScheduler Protected Abstract Methods
VirtualTimeScheduler Protected Methods
Inherited Classes
VirtualTimeScheduler Constructor
Rx.VirtualTimeScheduler(initialClock, comparer)
Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.
Arguments
initialClock
(Function): Initial value for the clock.comparer
(Function): Comparer to determine causality of events based on absolute time.
Example
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 */
);
VirtualTimeScheduler Instance Methods
Rx.VirtualTimeScheduler.prototype.advanceBy(time)
Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.
Arguments
time
(Any): Relative time to advance the scheduler's clock by.
Example
var scheduler = new MyVirtualScheduler(
200 /* initial time */
);
scheduler.scheduleAbsolute(null, 250, function () {
console.log('hello');
});
scheduler.advanceBy(300);
// => hello
console.log(scheduler.clock);
// => 500
Rx.VirtualTimeScheduler.prototype.advanceTo(time)
Advances the scheduler's clock to the specified time, running all work till that point.
Arguments
time
(Any): Absolute time to advance the scheduler's clock to.
Example
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
Rx.VirtualTimeScheduler.prototype.scheduleAbsolute(state, dueTime, action)
Schedules an action to be executed at dueTime.
Arguments
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
Returns
(Disposable): The disposable object used to cancel the scheduled action (best effort).
Example
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
Rx.VirtualTimeScheduler.prototype.scheduleRelative(state, dueTime, action)
Schedules an action to be executed at dueTime.
Arguments
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
Returns
(Disposable): The disposable object used to cancel the scheduled action (best effort).
Example
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
Rx.VirtualTimeScheduler.prototype.sleep(time)
Advances the scheduler's clock by the specified relative time.
Arguments
time
(Any): Relative time to advance the scheduler's clock by.
Example
var scheduler = new MyVirtualScheduler(
0 /* initial time */
);
scheduler.sleep(400);
console.log(scheduler.clock);
// => 400
Rx.VirtualTimeScheduler.prototype.start()
Starts the virtual time scheduler.
Example
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
Rx.VirtualTimeScheduler.prototype.stop()
Stops the virtual time scheduler.
Example
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
VirtualTimeScheduler Abstract Protected Methods
Rx.VirtualTimeScheduler.prototype.add(absolute, relative)
Adds a relative time value to an absolute time value. This method is used in several methods including scheduleRelative
, advanceBy
and sleep
.
Arguments
absolute
(Any): Absolute virtual time value.relative
(Any): Relative virtual time value.
Returns
(Any): Resulting absolute virtual time sum value.
Example
One possible implementation could be as simple as the following:
scheduler.add = function (absolute, relative) {
return absolute + relative;
};
Rx.VirtualTimeScheduler.prototype.toAbsoluteTime(absolute)
Converts an absolute time to a number. This is used directly in the now
method on the Rx.Scheduler
Arguments
absolute
(Any): The absolute time to convert.
Returns
(Number): The absolute time in ms.
Example
One possible implementation could be as simple as the following:
// String -> Number
scheduler.toAbsoluteTime = function (absolute) {
return absolute.length;
};
Rx.VirtualTimeScheduler.prototype.toRelativeTime(timeSpan)
Converts the time span number/Date to a relative virtual time value.
Arguments
timeSpan
(Any): The time span number value to convert. This is used directly inscheduleFuture
.
Returns
(Number): Corresponding relative virtual time value.
Example
One possible implementation could be as simple as the following:
// Number -> Number
scheduler.toRelativeTime = function (timeSpan) {
return timeSpan;
};