mergeMap observables呼び出しを組み合わせて、observable全体に対して1つの値のみを返す方法



How Combine Mergemap Observables Calls



解決:

mergeMapのすべての応答を組み合わせた結果を取得するには、次のようにすることもできます。

return this.request1()。pipe(mergeMap(res1 => this.request2(res1.id).pipe(map(res2 => {return {res1:res1、res2:res2}})))) 

Q1: あなたには必要だ toArray —すべてのストリーム値を1つの配列に結合します。



toArrayの例

Q2: ストリーム上のすべての値を省略し、完了時に値を出力するには



concat(source $ .pipe(ignoreElements())、of(true))

ソースの完了時に値を発行します

見る ' ソースの完了時に値を発行します '遊び場での例


これは、質問するサブスクリプションプロセスに関する質問を明確にするのに役立つ注釈付きの例です。



Q1:

別の答えで指摘されているように、削減演算子は、あなたがあなたに含めたいものですソースパイプライン。重要な詳細reduceは、監視可能な対応するソースの完了時にのみ放出することです。代わりに、それらの内部観測量が完了したときに放出が必要な場合は、スキャンが適切です。後者とのもう1つの違いは、ソースの補完を必要としないことです。

Q2:

この質問では、以下の私の例を参照して、処理パイプラインへの各引数を単一のリクエストの存続期間と考えてください。ここでは、完了は暗黙的です。これは、内部オブザーバブルの最後の値が処理された後に発生します。

ただし、内部オブザーバブルに制限がない場合、すべての内部オブザーバブルがいつ完了するかを知ることはできません。そのような場合、あなたはそれを見つけるでしょうreduce()は機能しません。

const {from、of、Subject} = rxjs; const {mergeMap、map、tap、reduce、scan} = rxjs.operators; //サブジェクトを使用して処理をシミュレートします。 //各引数を以下の処理パイプラインへのリクエストと考えてください。 constプロパティ=新しいSubject(); //処理パイプラインを確立しますconstsource = properties.pipe(//ここで `mergeMap`は出力値を結合された内部出力値にフラット化しますmergeMap(props => //引数内の各アイテムは(props)から個別の値としてパイプされる必要があります.pipe(// `mergeMap`は、出力値を` {key、value} `にフラット化しますmergeMap(key => of( 'test')。pipe(map(value =>({key、value}))、) 、)、// `scan`とは異なり、` reduce`は 'completion'でのみ発行されます。//ここでは、 'completion'は暗黙的です-// `from(props)`の最後の要素が処理された後です。reduce ((a、i)=> [... a、i]、[])、))、); //パイプラインをサブスクライブして、処理を監視します。 source.subscribe(console.log); //引数properties.next(['session'、 'user']);を使用して処理要求をトリガーします。 //別の処理要求をトリガーしますproperties.next(['session'、 'user']);