创建一个简单的调度程序

时间:2015-06-18 13:54:32

标签: rxjs

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

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

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

1 个答案:

答案 0 :(得分:10)

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

Scheduler的功能签名是

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

要打破它:

now - 一个表示调度程序时间概念的函数,在调用它时,它应该返回调度程序认为现在的内容。默认设置是返回new Date()

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

function scheduleNow(state, action) {}

其中action将具有签名

function action(scheduler, state) {}

它用于在调度程序上安排立即操作。立即将具有不同的含义,具体取决于您的调度程序,但是,对于大多数情况(immediateScheduler除外),您将希望在下一个tick中发生这种情况,无论这对您的调度程序意味着什么。您可以查看defaultScheduler,它可以帮助您找出环境中最佳方法(setImmediate是第一选择)。在你的情况下,因为立​​即意味着“从现在起一秒钟”,你可能只需将scheduleRelativethis.scheduleRelativeWithState(state, 1000, action)

一起发送到function scheduleRelative(state, dueTime, action) {}

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

setTimeout

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

scheduleAbsolute 这可能是最容易实现的,它与 scheduleRelative 具有相同的签名,但不是花费时间 relative 到现在无论现在(通常是now个对象),它都需要一个绝对的时间来转换它,你只需要从中减去this.scheduleWithRelativeAndState并将其传递给Disposable(参见我告诉过你)你会得到免费的东西。)

在所有情况下,3个计划方法都返回setTimeout,这用于尽力取消操作。在scheduleRelative的情况下,这将使用返回的id清除超时。

要最终回答你的问题,如果你想将所有内容延迟1秒,最好的方法可能是在http://www.GoodStuff.xxx/services/stu/query?where=1%3D1&text=&objectIds=231699%2C232002%2C231700%2C100646&time= 中为每个预定事件添加1秒/ 1000毫秒的转换。