RxJS中的“ Scheduler”是什么


71

我在文档中经常看到“调度程序”一词。

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

Answers:


131

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

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

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

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

唯一的实际选择是:

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

现在可能还有更多内容,例如,用于安排浏览器动画帧工作的计划程序等。

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


1
极好的解释!
yaquawa 2015年

3
极好的答案。这应该放在维基百科的某个地方。
Kurt Mueller 2015年

5
@Brandon,您好:我一直在研究Rxjs以在公司中使用一段时间,令我感到惊讶的是,调度程序没有使用Web Workers developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API / ...(尽管worker是单独的.js文件)-但是在我看来,Web Workers是适合计划程序的想法
Luke T O'Brien

5
@ LukeTO'Brien-Web Worker调度程序将很困难,因为您将执行可能带有闭包的“随机”函数。不清楚您将如何序列化该操作并将其发送给网络工作者以执行。但是,有一些RxJS工厂方法可让您将Web Worker视为消耗/产生消息的主题。
布兰登
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.