2017-12-28 24 views
0

私は角度アプリを構築しています。私のコンポーネントのコンストラクタでは、サーバーからいくつかの要素の要求を開始していますが、これは自然に非同期に発生します。これらのリクエストは、私がサブスクライブしているrxjs/Behaviorオブジェクトとして私に返されます。非同期イベントのリストを処理し、それらがすべて完了したら、続行するというエレガントな方法は何ですか?

私がする必要があることは、最後のものが戻ったらすぐに処理を続けることです。しかし、私はが必要です彼らが提出された順序で処理されていることを確認するために、必ずしも返された順序ではありません。

let counter = 0; 
let output = new Array(input.length); 
for (let i = 0 ; i < input.length ; i++) { 
    counter++; 
    fetch(input[i]).subscribe( 
    result => { 
     output[i] = result; 
     counter--; 
     if (counter === 0) { 
     // what to do at the end 
     } 
    } 
); 
} 

をそして、これは動作します:

私は最後のものが返されたときを検出するjankyハックを作成することができます。しかし、それは醜いです、理解することは容易ではなく、私は生産準備完了コードとは言いません。

対象の配列がすべて完成したら、何かを行う角度の仕組みは何ですか?

+0

あなたは '件名'を受け取るべきではありません。問題のAPIを管理している場合は、 '.asObservable()'を使用して実装を非表示にします。そうしなければ、新しい図書館を見つけることをお勧めします。 –

答えて

3

あなたはforkJoinを探しています:

Observable.forkJoin(...input.map(fetch)) 
.subscribe(responses => { 
    // responses contains the emitted values after completion 
    // in the same order as input 
    }); 

は、より多くの詳細とに注意すべき点についてthe docsを参照してください。

今後の拡張ヒントとして、rxjsのWebサイトには、様々な状況で探しているオペレータを見つけるのに役立つかなり良いアンケートがあります。

関連する問題