2016-11-28 119 views
1

我有一個訂閱呼叫,需要只接收一次數據。 其長時間運行的Angular 2頁面。Angular2和RXJS,一次接收數據後取消訂閱

我想確保訂閱不會在內存泄漏和第一次收到數據時退訂任何問題。

這是我的服務,使api查詢。它使用.first,所以一旦收到一次數據就應該清理。

getData(): Observable<string> { 
    let _url = SOME_API_URL; 
    return this._http.get(_url).first().map((response: Response) => { return response.json(); }); 
} 

這是我的Ng2訂閱。我需要做什麼嗎?確保在接收到第一個()數據後清理所有內容?

this._service.getData().subscribe((data: any) => { 
    // Do something once. 
    // DO I HAVE TO UNSUBSCRIBE OR WILL THE CLEANUP HAPPEN DUE TO THE ABOVE FIRST() CALL? 
}); 

我可以使用ngDestory,但不會被調用,因爲頁面長時間運行並且不經常刷新。

回答

3

first不會爲您訂閱Observable

例如,如果你這樣做:

Rx 
 
    .Observable 
 
    .of(1, 2, 3) 
 
    .first() 
 
    .map(x => console.log(x))
<script src="https://npmcdn.com/[email protected]/bundles/Rx.umd.js"></script>

沒有發生。

所以,你需要subscribeObservable ...是誰說subscribe說,你從它自己需要unsubscribe

let subscription = Rx 
 
    .Observable 
 
    .of(1, 2, 3) 
 
    .first() 
 
    .map(x => console.log(x)) 
 
    .subscribe(
 
    (success) => {}, 
 
    (error) => {}, 
 
    (done) => { console.log('unsubscribe') } 
 
); 
 

 
subscription.unsubscribe();
<script src="https://npmcdn.com/[email protected]/bundles/Rx.umd.js"></script>

只需保存在你的類變量之一subscription並實現onDestroy方法:

ngOnDestroy() { 
    this.subscription.unsubscribe(); 
} 

編輯1:

只是爲了更清楚:

如果你經歷first(),它會像你期望退訂。

但是,假設您的可觀察性需要很長時間,並且您決定移動到應用程序的其他位置,並且組件被破壞。可觀測值將保持活躍狀態​​(至少直到收到一個值)。

所以你應該仍然保持ngOnDestroy方法,以防你的組件在可觀察組件被取消訂閱之前被銷燬。

+0

謝謝您的信息。如果頁面長時間運行,那麼ngOnDestroy會觸發?我認爲這會在組件卸載時觸發。第一次收到數據後,我需要進行這種清理。這仍然是做到這一點的方法嗎? –

+0

@BenCameron我可能一直不清楚,我編輯了我的帖子。 – Maxime