用例:每分钟(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
对于轮询来说不是很好的可观察工厂,因为它们不会“等待”异步操作完成(最终可能会导致多个异步调用互相运行)。为此,我倾向于使用defer
和repeatWhen
如下:
延迟(()=>;doAsyncAction())
.烟斗(
repeatWhen(通知=>;通知.pipe(延迟(1234)))
);