【发布时间】:2019-01-31 18:51:41
【问题描述】:
用例: 每分钟(60000 毫秒)调用一个函数,该函数调度存储操作以获取项目的lastUpdated 状态,在响应和过滤后,更新存储,并读取更新的存储作为可观察的并显示在视图中)。只要网络应用程序处于打开状态(无限期地),这种情况就需要发生。
目前,我正在使用这个:
this.refreshDate = window.setInterval(
() => this.store.dispatch(new FetchLastUpdate())
, 60000);
当视图被销毁/卸载时,我删除了间隔:
if (this.refreshDate) {
clearInterval(this.refreshDate);
}
这是高效/有效,还是很麻烦?
我为什么要使用 RxJS 轮询策略,例如:
interval(60000)
.pipe(
startWith(0),
switchMap(() => this.store.dispatch(new FetchLastUpdate()))
);
或者
timer(0, 60000)
.pipe(
switchMap(() => this.store.dispatch(new FetchLastUpdate()))
);
TL;DR: window.setInterval() 与 RxJS timer()/interval()
结论/答案(便于研究):
使用 RxJS 函数设置间隔或执行轮询有很大的好处,这些好处在 selected answer 和 cmets 中都有解释,但得出的结论是(通过 cmets 中的讨论)对于非常简单的要求在本文开头的“用例”部分定义的,没有必要使用 RxJS,事实上如果你在程序的任何其他部分没有使用 RxJS,请不要导入它只是为了这个,但就我而言,我已经在其他地方导入并使用了 RxJS。
【问题讨论】:
-
我认为
FetchLastUpdate的持续时间不会超过60秒,所以使用switchMap似乎有点矫枉过正,我宁愿使用setInterval,这对于您的用例来说似乎已经足够了 -
@OlivierBoissé 对,这就是我一直在假设和坚持的,但我想我会寻求其他更有经验的意见。至于switchMap,你是对的,点击可能会更好。
-
此外添加
rxjs会增加你的js包大小,所以如果你在其他地方不需要它,你可以跳过它并使用setInterval -
@OlivierBoissé 确实如此,但由于您提到的原因(在其他地方使用),它不适用于我。谢谢:)
标签: javascript typescript rxjs rxjs5 rxjs6