如何在 RxJS 中停止 Observable 的间隔
Posted
技术标签:
【中文标题】如何在 RxJS 中停止 Observable 的间隔【英文标题】:How to stop an interval on an Observable in RxJS 【发布时间】:2018-04-08 09:03:06 【问题描述】:我有一种特殊情况,我正在使用 RxJS 间隔,但在任何给定时刻我都可能需要停止该间隔。我认为有一些简单的东西,比如 cancel() 或 stop()。类似于 clearTimeout。这有可能在间隔开始后停止吗?如果不是,那将是另一种方法。
基本上我有一个大数组,我正在逐步执行。但是可能会发生一些外部事情,因此有必要停止这一步骤并继续执行新任务。我希望这是我在文档中遗漏的简单内容。谢谢
【问题讨论】:
可能重复,已回答here 【参考方案1】:只需退订:
import interval from 'rxjs';
const subscription = interval(1000)
.pipe(...)
.subscribe();
...
subscription.unsubscribe();
请注意,由于interval()
是异步的,您也可以在subscribe
的回调中调用unsubscribe()
。
2019 年 7 月:针对 RxJS 6 更新。
【讨论】:
subscribe
导致命令式响应式代码,特别是当意图是 unsubscribe
时。这在小范围内更容易构建,但在大范围内更难维护。例如。 medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87 建议避免这种情况。
我冒昧地创建了一个jsfiddle,您可以在其中看到这个解决方案的实际效果。【参考方案2】:
这是否可以在间隔开始后停止?
您可以使用.takeUntil
运算符在其他一些可观察对象发出时完成可观察对象。您当然需要设置其他 observable 以对您有用的方式发出值,但这里有一个在 5 秒后停止间隔的示例:
Rx.Observable.interval(100)
.takeUntil(Rx.Observable.timer(5000))
.subscribe(val => console.log(val));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
【讨论】:
谢谢,我最终使用了 takeWhileObservable.interval( 100 ).takeWhile( val => takeUntil ).subscribe( val => ...
这不是多次创建计时器,这是不好的吗? @P.Huhn 的解决方案可以解决我的想法吗?
我正在尝试检查是否已完成,但在尝试 n 后放弃。以上是关于如何在 RxJS 中停止 Observable 的间隔的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Angular/RxJS 中合并两个 observable?
如何在 Angular 4 中推送到数组的 Observable? RxJS