gpt4 book ai didi

javascript - 将非标准调度程序传递给运算符(operator)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:32:55 24 4
gpt4 key购买 nike

假设我想将一个 Scheduler 传递给一个 RxJS 运算符,使其每 5 秒发出一次通知。当然,这很容易做到,只需使用 interval 或其他现有运算符即可。但是,如果我真的想使用调度程序来完成它,我该怎么做呢?

我的第一个想法是继承Rx.Scheduler.default。那是要走的路吗?如果是这样,该子类看起来如何?同样,我知道这是一种复杂的方法来完成一些使用运算符很容易的事情,但我只是对自定义调度程序感到好奇。

最佳答案

操作应该始终独立于用于实现它们的调度程序。调度员只知道一件事,时间。每个调度程序都是专门为处理自己的时间概念而构建的。它们显然是为处理特定运算符而构建的,因为那会是一个问题。

因此,对于您创建重复性任务的既定目标,我不建议尝试实际创建您自己的调度程序,因为根本不需要。调度程序带有一个已经支持此功能的接口(interface)。

您可以使用 schedulePeriodicscheduleRecursiveFuture 来完成此操作。

//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);
});
});
};

Reference 1 , Reference 2 ;

前者应该更容易理解,本质上它只是根据周期参数安排某些事情在时间间隔内重复发生。

后者通常有点难以解释,但本质上你是在安排一个任务,然后在执行该任务的某个时候你正在重新安排它(这就是 self 参数)正在做。这允许您使用 period 参数获得相同的效果。

这项工作的时间都直接受到您决定传递给运算符(operator)的调度程序的影响。例如,如果您传入 default,它将尝试使用最佳方法进行异步完成,无论是 setTimeoutsetInterval 还是还有一些我不记得了。如果你传入一个 TestScheduler 或一个 HistoricalScheduler 这实际上不会做任何事情,直到你增加它们各自的时钟,但这样做可以对时间流逝进行细粒度控制.

tl;dr 如果您有一些新的整体时间概念要表达,则只实现新的 Scheduler,否则使用现有 API 处理任何 调度程序 最适合您希望的时间流逝方式。

关于javascript - 将非标准调度程序传递给运算符(operator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com