什么是 RxJS 中的 `Scheduler`

what is a `Scheduler` in RxJS

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

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

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

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

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

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

唯一真正的选择是:

  • immediateScheduler - 立即同步运行工作。有点像根本不使用调度程序。因此安排的工作是 gua运行同步到 运行。
  • currentThreadScheduler - 与 immediateScheduler 相似,因为工作立即 运行。但是,它不会 运行 递归工作。因此,如果工作是 运行ning 并安排了 更多 工作,那么在当前工作完成后,额外的工作将被放入队列中成为 运行。因此有时 运行s 同步工作,有时异步工作。此调度程序可用于避免堆栈溢出或无限递归。例如 Rx.Observable.of(42).repeat().subscribe() 如果它在 immediate 调度器上 运行 会导致无限递归,但是由于默认情况下 currentThread 调度器上 return 运行s ,避免了无限递归。
  • timeoutScheduler - 唯一支持将工作安排在未来 运行 的调度程序。本质上使用 setTimeout 来安排所有工作(尽管如果您将工作安排为 运行 "now",那么它会使用其他更快的异步方法来安排工作)。在此调度程序上安排的任何工作都保证运行异步运行。

现在可能还有一些,比如调度浏览器动画帧等工作的调度器

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