【问题标题】:Do I need to unsubscribe from timer(1000)?我需要退订计时器(1000)吗?
【发布时间】:2019-06-21 19:01:48
【问题描述】:

如果我创建一个 timer() 并执行一次,例如:

timer(1000).subscribe(() => console.log("some logging"));

我需要退订吗?

文档说:

如果没有指定 period,则输出 Observable 只发出一个值

所以,据我了解RxJS,我猜,timer() 可能会在执行后完成。但我不太确定。没有弹珠图,它显示了一个完整的timer()

注意

不是询问如何退订;我需要知道没有给定期间的timer() 是否完成并且不需要取消订阅。

【问题讨论】:

  • 在提出问题之前,您是否考虑过实际测试它;)我的意思是,您正在使用console.log,因此您可以自己建立它,如果文档不够清楚:)
  • 但我该如何测试呢? console.log 显然记录了 1 时间,然后呢?我如何检查处理程序是否已删除?
  • subscribe() 接受 3 个参数。第三个是完成回调。如果它被调用,则意味着 observable 已经完成。如果已完成,则订阅者将被取消订阅。
  • @JBNizet 谢谢,我忘记了第三个订阅参数。
  • 仅供参考,subscribe 还可以选择使用带有nexterrorcomplete 属性的“观察者”对象:const myObserver = { next: console.log, error: console.错误,完成: () => console.log('complete') }; .subscribe(myObserver)

标签: angular rxjs


【解决方案1】:

它将完成,因为您没有提供第二个参数“句点”。

这里是文档http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-timer

这是一个暴露错误并在订阅中完成的示例https://stackblitz.com/edit/angular-rxjs-timer-test?file=index.ts

希望对你有帮助

【讨论】:

  • 感谢第三个subscribe参数的提醒!我没有想到这个。
【解决方案2】:

这是一个基于 timer() 文档的好问题,如果您不仔细完整地阅读它,这会有点令人困惑,因为它最初是这样说明的:

...发出无限的升序整数序列,...

无论如何,问题的答案是否定的,您不必像接受的答案那样取消订阅。

我想在这里提供一个小技巧,(如果您不确定、匆忙、懒惰或草率地了解您的 rsjx 工具),但仍想确保您的订阅取消订阅,您可以使用:

yourObservable.pipe(take(1)).subscribe( . . . // your action(s) //

管道拍摄 (1) 将为您关闭订阅。

【讨论】:

  • 感谢您的意见。在将 observable 转换为 Promise 时,我使用了 take 的技巧(我们先不谈,为什么这是必要的)。没有这个,这些 observables 也不完整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多