订阅不执行分配时对组件属性
我试图建立与rxjs一个angular2部件订阅不执行分配时对组件属性
this._subscription = Observable.timer(1000).subscribe(() => {
console.log('inside timeout')
})
内可观察到的超时功能,在其他方法退订它。但是如果我改变
let _subscription = Observable.timer(1000).subscribe(() => {
console.log('inside timeout')
})
它工作正常,可观察到从未执行 。我也试过
this._subscription=setTimeout(()=>{},1000)
同样的事情发生了。我怀疑这是ngZone的bug,所以我把这个功能包裹起来
this._ngZone.runOutsideAngular(() => {})
但是结果是一样的。任何人都会遇到同样的问题?我正在使用angular 2.2.4
在ngOnInit
方法中应该完成(大多数情况下)订阅observable。
所以,现在,如果你想从它退订,你可能会那样做:
private onDestroy$ = new Subject<void>();
private stopObs$ = new Subject<void>();
ngOnInit() {
someObs$
// stop the observable if the component is being destroyed
.takeUntil(this.onDestroy$)
// stop the component from another method if you want
.takeUntil(this.stopObs$)
.do(x => console.log(`A value has been received: ${x}`))
.subscribe();
}
callThisMethodToStopListeningToObs() {
this.stopObs$.next();
this.stopObs$.complete();
}
ngOnDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
}
这里someObs$
可能是一个interval
,一个timer
或任何可观察到的:)。
雅这是可能的方法,但似乎有点太复杂,我的问题。我可以修复它与本地变量let subs = setTimeout(),而不是this.subs = setTimeout(),但我只想知道为什么组件属性分配settimeout –
我不明白这是如何解决范的问题。 –
原来,我在onNgInit中有一个明确的订阅来清除组件初始化时的订阅。
NgInit在observable坐落的组件方法之后运行。因此它在创建后立即取消订阅。现在我删除了订阅重置,它工作正常。我学到的是你的组件方法可以在NgInit钩子发生前由其他组件调用
_并在其他方法中取消订阅它 - 显示完整的代码。 _同事发生了 - 同样的事情? –
可观察未执行。它仅在您未将其分配给订阅变量或将其分配给本地作用域subscrioption变量时才执行。 –
这是不正确的,只要你订阅一个observable它被执行,在你的情况下,在1000毫秒内,你应该看到日志消息**,除非**你在1000毫秒通过之前退订 –