RxJS中的“Scheduler”是什么?

我在文档中经常看到Scheduler这个词。

但是,这个词是什么意思? 我甚至不知道如何使用所谓的Scheduler 。 官方文档没有告诉我一个Scheduler到底是什么。 这只是RxJS中的一个共同的概念或特定的概念?

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

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

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

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

唯一真正的select是:

  • immediateScheduler – 立即同步运行工作。 有点像不使用调度程序。 因此预定的工作保证同步运行。
  • currentThreadScheduler – 与immediateScheduler类似,工作立即运行。 但是,它不会recursion运行。 因此,如果工作正在运行并计划更多工作,那么在当前工作完成之后,将额外的工作放入队列以便运行。 因此,工作有时同步运行,有时是asynchronous运行。 这个调度器对于避免堆栈溢出或无限recursion很有用。 例如,如果Rx.Observable.of(42).repeat().subscribe()会在immediate调度程序上运行,将导致无限recursion,但是由于默认情况下在currentThread调度程序上运行return ,所以可以避免无限recursion。
  • timeoutScheduler – 支持计划将来运行的工作的唯一调度程序。 本质上使用setTimeout来安排所有的工作(尽pipe如果你安排工作“现在”,那么它使用其他更快的asynchronous方法来安排工作)。 在这个调度器上计划的任何工作都是保证asynchronous运行的。

现在可能还有更多,比如安排在浏览器animation帧上工作的调度器等。

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