2016-05-31 42 views
2

我不知道如何使用的用戶做一個非常簡單的Angular2:Angular2使用訂閱人數爲承諾

a() { 
    return getValueFromService() // Return Observable 
    .subscribe(callA) 
} 

b() { 
    a().subscribe(callB) // This won't work as a() return a Subscriber 
} 

基本上,我想確保我的callB會經常來我的馬蹄蓮後。 這就像a()返回一個Promise和使用then()就可以了。

我正在使用最新的Angular2測試版。

回答

1

你可以充分利用do操作:

a() { 
    return getValueFromService() // Return Observable 
    .do(callA) 
} 

b() { 
    a().subscribe(callB) // This won't work as a() return a Subscriber 
} 

subscribe方法不返回可觀察到的,但訂閱...的do操作返回一個新的觀察到的,所以你可以在上面訂閱。當你想觸發某些東西但不處理結果時,必須使用它(結果不會在異步數據流中傳播)。

另一種選擇是利用了flatMap運營商,如果你想獲得認購回調中的getValueFromService結果:

a() { 
    return getValueFromService() // Return Observable 
    .flatMap(callA) 
} 

b() { 
    a().subscribe(callB) // This won't work as a() return a Subscriber 
} 

在這種情況下,callA必須返回一個可觀察的。

1

可以

a() { 
    return getValueFromService() // Return Observable 
    .toPromise().then(callA); 
} 

b() { 
    a().toPromise().then(callB); // This won't work as a() return a Subscriber 
} 

然後調用它像

a().then(b); 
+0

相信觀測量現在的新標準,我想盡量避免使用承諾。我不確定你現在在哪個版本的Angular2中,但是在我的Observable上沒有toPromise()。 – Scipion

+0

'toPromise'是一個運算符,和每個運算符一樣,它需要像'import'rxjs/add/operator/toPromise';'一樣導入。有一些關於觀測值的宣傳,他們有一些優勢。儘管「承諾」仍然有效。如果你更喜歡'Observable',那麼Thierrys的答案應該適合你的需要。 –

+1

我的不好,實際上我忘了添加操作符。謝謝你在這裏的貢獻先生。 – Scipion