什么是RxJS中的“调度程序”

时间:2015-01-26 07:02:46

标签: rxjs

我在文档中经常看到术语Scheduler

但是,这个术语是什么意思?我甚至不知道如何使用所谓的Scheduler。官方文档没有告诉我Scheduler究竟是什么。这只是RxJS中的常见概念还是特定概念?

1 个答案:

答案 0 :(得分:125)

Rx调度程序提供了一个抽象,允许调度工作,可能在将来运行,而调用代码不需要知道用于调度工作的机制。

每当Rx方法需要生成通知时,它就会在调度程序上安排工作。通过向Rx方法提供调度程序而不是使用默认方法,您可以巧妙地控制这些通知的发送方式。

在Rx的服务器端实现(例如Rx.NET)中,调度程序起着重要作用。它们允许您在线程池或专用线程上安排繁重的工作,并在UI线程上运行最终订阅,以便您可以更新UI。

使用RxJs时,实际上很少需要担心大多数方法的调度程序参数。由于JavaScript本质上是单线程的,因此调度没有很多选项,默认调度程序通常是正确的选择。

唯一真正的选择是:

  • immediateScheduler - 立即同步运行工作。有点像根本不使用调度程序。这样安排的工作可以保证同步运行。
  • currentThreadScheduler - 与immediateScheduler类似,因为工作立即开始。但是,它不会递归地运行。因此,如果工作正在运行并且计划更多工作,那么该额外工作将被放入队列中,以便在当前工作完成后运行。因此,工作有时同步运行,有时是异步运行。此调度程序可用于避免堆栈溢出或无限递归。例如Rx.Observable.of(42).repeat().subscribe()如果在immediate调度程序上运行会导致无限递归,但由于return默认情况下会在currentThread调度程序上运行,因此可以避免无限递归。
  • timeoutScheduler - 唯一支持计划在将来运行的工作的调度程序。基本上使用setTimeout来安排所有工作(虽然如果你安排工作“现在”运行,那么它使用其他更快的异步方法来安排工作)。保证在此调度程序上安排的任何工作都是异步运行。

现在可能还有更多,例如安排在浏览器动画帧上工作的调度程序等。

如果您正在尝试编写可测试代码,那么您几乎总是希望提供调度程序参数。这是因为在您的单元测试中,您将创建testScheduler实例,这将使您的单元测试控制Rx代码使用的时钟(从而控制操作的确切时间)。