分配给组件属性时,不会执行订阅

时间:2017-10-19 07:44:38

标签: javascript angular rxjs

我尝试使用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

2 个答案:

答案 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$可能是intervaltimer或任何可观察的内容:)。

答案 1 :(得分:0)

事实证明我在onNgInit上有一个明确的订阅,以便在组件初始化时清除订阅。

NgInit在observable所在的组件方法之后运行。因此它在创建后立即取消订阅。现在我删除了订阅重置,它工作正常。我学到的是你的组件方法可以在NgInit挂钩发生之前由其他组件调用