RxJS 中的“调度器”是什么

我在文档中经常看到术语 调度员

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

12989 次浏览

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

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

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

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

唯一真正的选择是:

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

现在可能还有一些,比如一个调度程序,它可以调度浏览器动画框架上的工作,等等。

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