2017-10-19 72 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鉤子發生前由其他組件調用