2017-10-19 42 views
1

我试图建立与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

+3

_并在其他方法中取消订阅它 - 显示完整的代码。 _同事发生了 - 同样的事情? –

+0

可观察未执行。它仅在您未将其分配给订阅变量或将其分配给本地作用域subscrioption变量时才执行。 –

+0

这是不正确的,只要你订阅一个observable它被执行,在你的情况下,在1000毫秒内,你应该看到日志消息**,除非**你在1000毫秒通过之前退订 –

回答

1

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或任何可观察到的:)。

+0

雅这是可能的方法,但似乎有点太复杂,我的问题。我可以修复它与本地变量let subs = setTimeout(),而不是this.subs = setTimeout(),但我只想知道为什么组件属性分配settimeout –

+0

我不明白这是如何解决范的问题。 –

0

原来,我在onNgInit中有一个明确的订阅来清除组件初始化时的订阅。

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