2017-02-20 53 views
0

我發現了很多例子,詳細描述了多個可觀察調用如何組合成一個Observable調用,但從我發現的情況來看,這些調用始終假定至少有下列之一:Angular 2結合了多個(類似)可觀察元素

1:通話次數已知 2:通話次數固定爲 3:通話是將不同的對象合併爲一。 (如在arg1 => call1,arg2 => call2)

但我沒有找到任何體面的信息,如何處理這些調用的組合,當這些調用動態或當時而不是映射結果不同變量,你想擴展你想要收集的列表。

給出一個適用的用例:用戶可以註冊幾個「組」產品。每個組都鏈接一個ID,用於從遠程服務中獲取產品。該組將從所有組中提取所有產品,將它們結合在一起並顯示給用戶。

對我來說,最合乎邏輯的解決方案似乎是等待所有調用完成,並將結果收集到另一個列表中,然後從這裏很容易將這些列表編譯成單個想要的結果,但我已經一直無法找到有效實現這一目標的方法 - 我很好奇聽到其他人是否可以對如何最好地解決這個問題提出想法。

let responses = Array<Observable<Articles>> 
    for (let id of subscriptions) { 
     let response = this.http.get(producturl + id, headers).map(
      //insert mapping... 
     ); 
    responses.push(response); 
} 

從這裏我曾嘗試使用.merge()嘗試了「迴應」合併在一起,但覺得我不熟悉不夠用命令/濫用它。我也嘗試遍歷Observables並依次訂閱它們,但是這看起來既不是最優的,也不會產生想要的結果。我已經嘗試了更多,但是這兩種選擇似乎最有可能成爲正確解決方案的正確途徑......如果需要更多代碼來查看潛在問題可能存在的地方,我會很樂意分享 - 並感謝您的任何意見。

回答

0

您可以用正常的reduce一起使用forkJoin

let responses: Array<Observable<Articles>> = []; 
for (let id of subscriptions) { 
    let response: Observable<Articles> = this.http.get(producturl + id, headers).map(); 
    responses.push(response); 
} 

Observable.forkJoin(responses) 
    .map(response => response.reduce((a,b) => {return a.concat(b)})) 
    .subscribe((response: Articles[]) => { 
     console.log(response); 
     //output is a flat array of all Articles 
}); 

不要忘記添加rxjs操作:

import 'rxjs/add/observable/forkJoin'; 
+0

嘿皮埃爾。感謝您的答覆 - 我還發現了一些使用forkJoin的示例,但沒有找到像這樣的文檔。看來這正是我需要的! 只有兩個注意事項:你錯過了地圖末尾的「)」,而concat不是本地函數。儘管我認爲這是一種確保你正在合併的列表不會以重複結束的方法,但事實並非如此。 –

+0

我確實沒有想到')':D,在stackoverflow答案字段中沒有代碼提示。 [concat](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)雖然是本地數組函數:)。與減少一起確保二維數組成爲一維。雖然 – PierreDuc

+0

沒有檢查重複,但我看到了什麼問題 - 減少響應是假設你得到一個結果對象,它不是一個數組,而是一個單獨的「articles」對象,其中concat操作符是不可能的。這可以通過確保聲明你會得到一個列表來解決 - 所以在這個實例中Array >> 不要試圖減損你的幫助,我很感激 - 只是想讓確保任何潛在的未來訪問這個主題的人都不會奇怪爲什麼代碼似乎沒有工作。 :) –