为什么我要使用RxJS interval()或timer()轮询而不是window.setInterval()?

用例:每分钟(60000毫秒)调用一个函数,该函数调度存储操作以获取项目的lastUpdated状态,该状态在响应和筛选后更新存储,更新的存储被读取为可观察状态并显示在视图中)。只要web应用程序处于打开状态,这种情况就需要发生(所以无限期)

目前,我正在使用:

this.refreshDate=window.setInterval(
()=>this.store.dispatch(新的FetchLastUpdate())
, 60000);

当视图被销毁/卸载时,我删除间隔,如下所示:

if(此.refreshDate){
clearInterval(此.refreshDate);
}

这是有效的还是麻烦的

为什么我要使用RxJS轮询策略,如:

间隔(60000)
.烟斗(
startWith(0),
switchMap(()=>this.store.dispatch(new FetchLastUpdate()))
);

计时器(0,60000)
.烟斗(
switchMap(()=>this.store.dispatch(new FetchLastUpdate()))
);

TL;DR:window.setInterval()vs.RxJStimer()/interval()


结论/答案(为了便于研究):

使用RxJS函数设置间隔或执行轮询有很大的好处,这些好处在选择的答案中有解释,也在评论中有解释,但是(通过评论中的讨论)得出结论,对于本篇文章开头的“用例”部分中定义的非常简单的需求,没有必要使用RxJS,事实上,如果您没有在程序的任何其他部分使用RxJS,请不要仅为此导入RxJS,但是在我的情况下,我已经在其他地方导入并使用了RxJS

RxJS的优势:

懒惰

您可以创建您的可观察对象,直到调用subscribe为止,一切都不会发生。可观察=纯函数。这给了你更多的控制,更容易的推理,并允许下一点

可组合性

您可以将间隔/计时器与其他操作符以统一的方式组合起来创建自定义逻辑-例如,您可以映射重复重试获取。。。等。见所有操作员

错误处理

如果发生错误,您负责调用clearTimeout/clearInterval——可观察对象将为您处理此问题。导致更干净的代码更少的内存泄漏错误

当然,任何你用可观察物做的事情,你也可以不用可观察物做——但这不是重点。可观察到的东西让你的生活更轻松


还要注意的是,interval/timer对于轮询来说不是很好的可观察工厂,因为它们不会“等待”异步操作完成(最终可能会导致多个异步调用互相运行)。为此,我倾向于使用deferrepeatWhen如下:

延迟(()=>doAsyncAction())
.烟斗(
repeatWhen(通知=>通知.pipe(延迟(1234)))
);

发表评论