如何在 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>

【讨论】:

谢谢,我最终使用了 takeWhile Observable.interval( 100 ).takeWhile( val => takeUntil ).subscribe( val => ... 这不是多次创建计时器,这是不好的吗? @P.Huhn 的解决方案可以解决我的想法吗? 我正在尝试检查是否已完成,但在尝试 n 后放弃。

以上是关于如何在 RxJS 中停止 Observable 的间隔的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular/RxJS 中合并两个 observable?

取消订阅 RxJS Observables

RxJS:我将如何“手动”更新 Observable?

如何在 Angular 4 中推送到数组的 Observable? RxJS

如何在 redux-observable 史诗中链接 RxJS 可观察?

如何在RXJS 6.3.3中使用ForkJoin导入Observer?