创建一个简单的调度程序

Creating a simple scheduler

我将如何着手创建一个简单的调度程序,将每个项目延迟一秒?我想将它用于 Observable,是的,我知道可以通过多种其他方式完成,我只是想使用自定义调度程序来完成它。

这里有一些相关的教程:http://codebetter.com/matthewpodwysocki/2010/05/12/introduction-to-the-reactive-extensions-for-javascript-custom-schedulers/但是已经过时了,API现在看起来很不一样了。

目前的文档也不是很有用,但我想我应该使用 Rx.Scheduler.prototype.schedulePeriodic,虽然我不知道 action 参数应该是什么。

要从基本调度程序创建新的调度程序,您应该查看 scheduler.js。从本质上讲,您需要了解如何做 4 件事,您将自动免费获得所有定期、递归、异常处理扩展。

Scheduler的函数签名是

function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute){}

分解:

now - 一个表示调度程序时间概念的函数,在任何时候调用它都应该 return 调度程序的想法 现在 是。默认是 return new Date()

schedule - 应尽快执行操作时调用的函数此函数具有签名

function scheduleNow(state, action) {}

其中操作将具有签名

function action(scheduler, state) {}

它用于在调度程序上安排即时操作。根据您的调度程序,立即将具有不同的含义,但是,对于大多数情况(immediateScheduler 除外),您将希望它在下一个 tick 中发生,无论这对您的调度程序意味着什么。您可以查看 defaultScheduler,它可以帮助找出环境中的最佳方法(setImmediate 是首选)。在你的情况下,因为立​​即意味着 "one second from now",你可能只是将它路由到 scheduleRelativethis.scheduleRelativeWithState(state, 1000, action)

scheduleRelative 当动作应该在相对于现在的未来某个时间发生时被调用:

function scheduleRelative(state, dueTime, action) {}

同样,这可能会使用 setTimeoutdueTime 作为时间参数。

scheduleAbsolute 这可能是最容易实现的,它与 scheduleRelative 具有相同的签名,但不是花时间 relative to now 无论现在是什么(通常是 Date 对象)都需要绝对时间,要转换它你真的只需要从中减去 now 并传递它进入 this.scheduleWithRelativeAndState(看我告诉过你你会得到免费的东西)。

在所有情况下,3 种计划方法 return 和 Disposable,用于尽最大努力取消操作。在 setTimeout 的情况下,这将使用 returned id 清除超时。

最后回答你的问题,如果你想将所有事情延迟 1 秒,最好的方法可能是应用 scheduleRelative 的转变,为每个计划的事件增加 1 second/1000 毫秒。