假设我想将调度程序传递给RxJS运算符,使其每5秒发出一次通知.当然,仅使用间隔或其他现有运算符就可以轻松完成.但是,如果我真的想使用调度程序来完成它,我该怎么做呢?
我的第一个想法是继承Rx.Scheduler.default.这会是要走的路吗?如果是这样,该子类怎么样?同样,我理解这是一种复杂的方法来完成使用运算符很容易的东西,但我只是对自定义调度程序感到好奇.
解决方法:
操作应始终独立于用于实现它们的调度程序.调度员只知道一件事,时间.每个调度程序都专门用于处理自己的时间概念.它们明确地不是为处理特定操作符而构建的,因为这将是一个关注点的混合.
因此,对于您创建定期任务的既定目标,我不建议您尝试实际创建自己的调度程序,而根本不需要.调度程序带有一个已经支持此功能的接口.
您可以使用schedulePeriodic或scheduleRecursiveFuture来完成此任务.
//Using periodic
Rx.Observable.interval = function(period, scheduler) {
return Rx.Observable.create(function(observer) {
return scheduler.schedulePeriodic(0, period, function(count) {
observer.onNext(count);
return count + 1;
});
});
};
//Using scheduleRecursive
Rx.Observable.interval = function(period, scheduler) {
return Rx.Observable.create(function(observer) {
return scheduler.scheduleRecursiveFuture(0, period, function(count, self) {
observer.onNext(count);
self(period, count + 1);
});
});
};
前者应该更容易包围你的头,基本上它只是根据周期参数安排在时间上重复间隔发生的事情.
后者通常有点难以解释,但实际上你是在安排一个任务,然后在执行该任务的某个时候你重新安排它(这是self参数)正在做的事情.这允许您使用period参数获得相同的效果.
这项工作的时间直接受到您决定传入操作符的调度程序的影响.例如,如果传入默认值,它将尝试使用最佳方法进行异步完成,无论是setTimeout,setInterval还是其他一些我不记得的事情.如果传入TestScheduler或HistoricalScheduler,在递增每个时钟之前实际上不会执行任何操作,但这样做可以对时间流量进行精细控制.
tl; dr如果你有一些新的整体时间表达,那么只实现新的调度程序,否则使用现有的API来处理最适合你想要时间通过的调度程序.