2017-05-30 98 views
0

我有一個函數,可以選擇設置一個標題與從localStorage檢索的數據。 localStorage操作返回一個承諾,我可以變成一個Observable。一旦標頭設置(或沒有),我想打一個http請求並返回可觀察到的結果:等待觀察者完成,開始另一個,並訂閱其輸出

let startObs; 
if (useHeaders) { 
    startObs = Observable.fromPromise(this.getStoredHeaders()); 
} 
else { 
    startObs = Observable.empty(); 
} 

// wait for startObs here 

return this.http.get(url, headers); 

基本上我想等startObs完成,然後返回http.get觀察到。我曾嘗試使用類似startObs.concat(this.http.get())startObs.switch(this.http.get())的東西,但是這會從可觀察源和http.get可觀察值發出。我只想想要發出的http.get可觀察。

有沒有什麼辦法可以只等待鏈中的最後一個觀察值,而等待先前的觀察值才能完成?

+0

你在哪裏訂閱數據?更新到 – Aravind

+0

這是異步的,這是可觀察到的整點:)所以你將無法按照你想要的方式完成。你應該訂閱和做你想要的訂閱,但訂閱服務也不是一個好主意。您應該簡單地創建可觀察鏈,並從組件訂閱它,例如 – Maxime

+0

您可以使用concat()然後使用last()。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-last –

回答

0

你不能達到你想要像concatswitch經營什麼,因爲你仍然可以調用this.http.get()同步(之前已存儲的標頭是準備好)。使用mergeMap代替:

return startObs.mergeMap(headers => this.http.get(url, headers)); 
0

這看起來像一個簡單的任務concatMap

startObs 
    .concatMap(() => this.http.get(url, headers)) 
    .subscribe(...); 

因爲它應該使用一個回調函數,你可以簡單地忽略從源startObs發出的值映射值,只是返回一個新的Observable。

您也可以鏈接多個concatMap運算符,因爲它們只在前一個完成時訂閱下一個Observable。