在可观察完成时处置订阅

时间:2016-11-29 11:44:10

标签: angular rxjs observable

在Angular 2的指南中,它说:

" Observable运算符的默认行为是在发布.complete()或.error()消息后立即处理订阅。请记住,RxJS旨在用于“火灾和忘记”。时尚大部分时间。"

在前面的页面中有一个可观察和订阅的例子。

example here

你可以在3秒后看到onbservable" .complete()" '第但是当再次单击Init()按钮并调用init()方法时,仍然会通知订户。那么作者的意思是说什么呢 "处理订阅"

代码:

       document.querySelectorAll('li');

3 个答案:

答案 0 :(得分:0)

这是因为每次单击init时都会创建一个新的observable。尝试更改您的行:

this.data = ...

if(!this.data){
  this.data = ...

你会看到init的进一步调用不会调用处理程序

答案 1 :(得分:0)

在构造函数中移动Observable的创建。

您可以在构造函数中包含一个主题,例如

constructor() {   
   super();   
   this.data$ = new Rx.Subject(); 
}

然后在您的点击处理程序中,您可以执行以下操作:

this.data.onNext(42)

如果您也手动触发onComplete,则必须在调用onNext之前检查流是否已完成

答案 2 :(得分:0)

当您在位置或路由器事件等事件上创建订阅时,订阅会在您的组件被销毁后保留现有事件,这可能导致很难找到错误和不需要的行为。

当触发http调用时,连接在成功传输后关闭,您的订阅将被关闭,因为observable会触发complete()。

以下是我最近编写的代码示例:

electionState

在这个例子中已经构建了一个类似于redux的状态存储,并在此组件中订阅了它。 ComputeStringHash()始终存在且永不完成。

当此组件被销毁时,订阅处置。否则,每次初始化组件时都会创建一个新订阅,如果没有其他错误发生,可能会导致性能问题。