Description
RxJS-Scheduler(调度器)
调度器控制着何时启动subscription和何时发送通知。调度器可以规定observable在什么样的执行上下文中发送通知给它的观察者。它由三个部分组成:
- 调度器是一种数据结构。它知道如何根据优先级或其他标准来存储任务和将任务排序。
- 调度器是执行上下文。它表示在何时何地执行任务。
- 调度器有一个虚拟的时钟。调度器功能通过它的
getter
方法now()
提供了时间的概念。在具体调度器上安排的任务将严格遵循该时钟所表示的时间。
示例:采用普通的Observable,它同步的发出值1
,2
,3
,并使用操作符observeOn
来指定async
调度器发送这些值。
var observable = Rx.Observable.create(function(observer){
observer.next(1);
observer.next(2);
observer.next(3);
observer.complete();
})
.observeOn(Rx.Scheduler.async);
console.log('before subscribe')
observable.subscribe({
next: x => console.log('got value '+ x),
error: e => console.error(error),
complete: () => console.log('donw')
})
console.log('after subscribe')
输出结果:
before subscribe
after subscribe
got value 1
got value 2
got value 3
done
使用调度器
静态创建操作符通常可以接收调度器作为参数。 例如,from(array, scheduler)
可以指定调度器,当发送从array转换的每个通知时使用。调度器通常作为操作符的最后一个参数。下面的静态创建操作符接收调度器作为参数:
- bindCallback
- bindNodeCallback
- combineLatest
- concat
- empty
- from
- fromPromise
- interval
- merge
- of
- range
- throw
- timer
**使用subscribeOn来调度subscribe()调用在什么样的上下文中执行。**默认情况下,Observable的subscribe()
调用会立即同步的执行,使用实例操作符subscribeOn(scheduler)
可以延迟或安排在给定的调度器上执行实际的subscription。
使用observeOn来调度发送通知的上下文,实例操作符observeOn(scheduler)
在源Observable和目标观察者中间引入了一个中介观察者。中介观察者负责调度,它使用给定的scheduler
来调用目标观察者。
实例操作符可能会接收调度器作为参数
像erTime、debounceTime、delay、auditTime、sampleTime、throttleTime、timeInterval、timeout、timeoutWith、windowTime
这样时间相关的操作符全部接收调度器作为最后的参数。并且默认的操作是在Rx.Scheduler.async
调度器上。
其他接收调度器作为参数的实例操作符: cache
、combineLatest
、concat
、expand
、merge
、publishReplay
、startWith
。