2016-07-24 102 views
1

我正在做一個現有的登錄檢查應用程序的開始,我只想要一次。我們如何在第一次後取消訂閱?我試圖採取(1),但似乎並不奏效。在第一次後取消可觀察 - Angular2,TypeScript,rxjs/Observable

this.auth.getUserData().take(1).subscribe(data => { // the take(1) doesn't work 
    console.log('Firebase responded with success.'); 
    this.rootPage = TabsPage; 
}, err => { 
    console.log('Firebase responded with error.', err); 
    this.rootPage = LoginEmailPage; 
} 
); 
+1

您能否提醒您「不工作」是什麼意思?它實際上是否不止一次地調用您的訂閱處理程序?爲什麼要取消訂閱?觀察結果完成還不夠嗎? –

回答

2

你試過first()而不是take(1)

根據您的進口在模塊級,你可能要添加一個導入爲第一操作

import 'rxjs/add/operator/first' 

雖然這實際上並沒有取消訂閱,它完成了我認爲是意味着的觀察。

編輯:將取消原先由OP

要求.subscribe(...)的結果認購了明確的方法將返回一個處理程序訂閱。您可以使用手柄來明確取消訂閱和代碼是這樣的:

let subscription = this.auth.getUserData().take(1).subscribe(data => { // the take(1) doesn't work 
    console.log('Firebase responded with success.'); 
    this.rootPage = TabsPage; 
    subscription.unsubscribe(); 
}, err => { 
    console.log('Firebase responded with error.', err); 
    this.rootPage = LoginEmailPage; 
} 
); 

雖然覺得不妥,明確取消訂閱,在這種情況下,一個常見的模式是內ngOnInit()或基於創建訂閱在post init事件上,並取消ngOnDestroy()中的掛起訂閱。

+1

'first()'和'take(1)'是相同的行爲 – paulpdaniels

+0

然後我不明白OP在找什麼。我將編輯我的答案,具體說明如何取消訂閱。 –

+2

答案是關於正確和相同的:http://stackoverflow.com/questions/34548924/missing-observable-methods-rxjs-5-0-0-beta-0?noredirect=1&lq=1隨着最近的角度版本,必須指定rxjs導入。 – sathishvj