在Angular 2的指南中,它说:
" Observable运算符的默认行为是在发布.complete()或.error()消息后立即处理订阅。请记住,RxJS旨在用于“火灾和忘记”。时尚大部分时间。"
在前面的页面中有一个可观察和订阅的例子。
你可以在3秒后看到onbservable" .complete()" '第但是当再次单击Init()按钮并调用init()方法时,仍然会通知订户。那么作者的意思是说什么呢 "处理订阅" ?
代码:
document.querySelectorAll('li');
答案 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()
始终存在且永不完成。
当此组件被销毁时,订阅处置。否则,每次初始化组件时都会创建一个新订阅,如果没有其他错误发生,可能会导致性能问题。