2017-02-20 11 views
0

複数の観測可能な呼び出しを1つのObservable呼び出しにどのように組み合わせるかを詳しく説明した例がありますが、見つかったものから、複数の(類似の)観測値の角度2結​​合

1:コール数は既知です 2:コール数が固定されています 3:コールは異なるオブジェクトが1つにまとめられています。 (arg1 => call1、arg2 => call2のように)

しかし、これらの呼び出しが動的に行われた場合や結果を別のものにマッピングするのではなく、Observablesの組み合わせを処理する方法について、まともな情報を見つけることができませんでした変数を使用して、収集しようとしているリストを展開したいとします。

これを適用できるユースケースを提供する:ユーザーは、製品のいくつかの「グループ」にサインアップできます。各グループは、リモートサービスから製品を取得するために使用される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を反復して順番に購読しようと試みましたが、これは最適ではないように思われて、望みの結果を生み出さなかったようです。私はもっ​​と試しましたが、これらの2つのオプションは正しい解決策に向かう可能性が最も高いようです...潜在的な問題がどこにあるのかを知るためにコードが必要な場合は、そして、どんな入力にも感謝します。

答えて

0

あなたは、通常のreduceと一緒forkJoinを使用することができます。

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

ねえピエール:

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オペレータを追加することを忘れないでください。返信いただきありがとうございます - 私はforkJoinを使用していくつかの例を見つけましたが、このようなドキュメントが見つかりませんでした。それがまさに私が必要としているようだ! ちょうど2つのノート:マップの最後に ")"が欠けていて、concatはネイティブ関数ではありません。マージしているリストが重複しないようにする方法だとは思いますが、必要であるとは思われませんでしたか? –

+0

私は確かに ')':D、stackoverflowの回答フィールドにコードヒントはありませんでした。 [concat](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)はネイティブ配列関数です:)。それを減らすと同時に、2次元配列が1次元になるようにします。 – PierreDuc

+0

ええ、私は問題が何かを見ました - 応答を減らすことは配列ではなく、concat演算子が使用できない単一の "articles"オブジェクトである1つの結果オブジェクトを取得することを前提としています。これは、あなたがそれからリストを取得することを確認することによって修正することができます - したがって、このインスタンスではArray >> あなたの助けを損なうつもりはない、私は感謝しています - このトピックへの将来の潜在的な訪問者は、コードがなぜ機能していないのか不思議に思うことはありません。 :) –

関連する問題