![](/img/trans.png)
[英]Combining multiple Http streams with RxJS Observables in Angular
[英]Angular 2 combining of multiple (similar) observables
我發現了許多示例,這些示例詳細說明了如何將多個可觀察的調用合並為一個可觀察的調用,但是從我發現的情況來看,這些調用始終假定至少以下之一:
1:已知通話數量2:固定通話數量3:通話是將不同的對象組合為一個。 (如arg1 => call1,arg2 => call2)
但是,當這些調用是動態進行的,或者不是將結果映射到不同的變量,而是希望擴展到您要收集的列表時,我沒有找到任何有關如何處理Observable組合的體面信息。
給出一個適用的用例:用戶可以注冊多達幾個“組”的產品。 每個組均與一個ID鏈接,該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()嘗試將“響應”合並到一起,但是感覺好像我對命令不足夠熟悉/濫用它。 我還嘗試了遍歷Observable並依次訂閱它們,但這似乎既不是最優的,也沒有產生想要的結果。 我已經嘗試了更多,但是在我看來,這兩個選項最有可能找到適當解決方案的正確途徑...如果需要更多代碼以查看潛在問題所在,我很樂意分享-並感謝您的任何投入。
您可以使用forkJoin
連同正常reduce
:
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';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.