我尝试使用angular2组件中的rxjs observable设置超时函数
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错误所以我将函数包装在中
this._ngZone.runOutsideAngular(() => {})
但结果是一样的。以前有人遇到过同样的问题吗?我正在使用棱角分明2.2.4
答案 0 :(得分:1)
在ngOnInit
方法中,应该(在大多数情况下)订阅可观察量。
现在,如果您想取消订阅,可以这样做:
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
或任何可观察的内容:)。
答案 1 :(得分:0)
事实证明我在onNgInit上有一个明确的订阅,以便在组件初始化时清除订阅。
NgInit在observable所在的组件方法之后运行。因此它在创建后立即取消订阅。现在我删除了订阅重置,它工作正常。我学到的是你的组件方法可以在NgInit挂钩发生之前由其他组件调用