【问题标题】:How to stop an interval on an Observable in RxJS如何在 RxJS 中停止 Observable 的间隔
【发布时间】:2018-04-08 09:03:06
【问题描述】:

我有一种特殊情况,我正在使用 RxJS 间隔,但在任何给定时刻我都可能需要停止该间隔。我认为有一些简单的东西,比如 cancel() 或 stop()。类似于 clearTimeout。这有可能在间隔开始后停止吗?如果不是,那将是另一种方法。

基本上我有一个大数组,我正在逐步执行。但是可能会发生一些外部事情,因此有必要停止这一步骤并继续执行新任务。我希望这是我在文档中遗漏的简单内容。谢谢

【问题讨论】:

  • 可能重复,已回答here

标签: javascript rxjs observable rxjs5


【解决方案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 后放弃。
猜你喜欢
  • 2019-10-04
  • 2017-04-25
  • 2016-05-02
  • 2016-09-24
  • 2018-12-06
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多