ちょうど間の違いであるのだろうかObservable.combineLatest
と Observable.forkJoin
?私が見る限り、唯一の違いは、最新の値forkJoin
をcombineLatest
返しながら、Observablesが完了することを期待していることです。
回答:
forkJoin
すべての入力オブザーバブルを完了する必要があるだけでなく、入力オブザーバブルによって生成された最後の値の配列である単一の値を生成するオブザーバブルも返します。つまり、最後の入力オブザーバブルが完了するまで待機してから、単一の値を生成して完了します。
対照的に、combineLatest
すべての入力オブザーバブルが少なくとも1つの値を生成すると、入力オブザーバブルが実行するたびに新しい値を生成するオブザーバブルを返します。これは、無限の値を持つ可能性があり、完了しない可能性があることを意味します。また、値を生成する前に入力オブザーバブルを完了する必要がないことも意味します。
.catch()
、.onErrorResumeNext()
おそらく、および.retry()
(HTTP呼び出しが断続的に失敗する可能性がある場合)。
combineLatest()
、入力オブザーバブルの最新の値から出力値を生成する方法を指定する射影関数を指定できます。デフォルトでは、指定しない場合、発行された最新の値の配列を取得します。
また:
combineLatest
内部的にはを使用しますconcat
。これは、次の配列に移動する前に、配列内のオブザーバブルごとに値を取得する必要があることを意味します。
// partial source of static combineLatest (uses the rxjs/operators combineLatest internally):
// If you're using typescript then the output array will be strongly typed based on type inference
return function (source) { return source.lift.call(from_1.from([source].concat(observables)),
new combineLatest_1.CombineLatestOperator(project)); };
3つのソースオブザーバブルがあり、それぞれの実行に5秒かかる場合、実行には15秒かかりcombineLatest
ます。一方forkJoin
、それは5秒かかりますので、それらを並列に実行します。
したがって、順序が強制されていない場合のforkJoin
ようPromise.all(...)
に機能します。
オブザーバブルのいずれかがエラーになった場合combineLatest
、後続のオブザーバブルは実行されませんが、forkJoin
すべて実行されています。したがってcombineLatest
、オブザーバブルの「シーケンス」を実行し、結果をすべてまとめて収集すると便利です。
高度な注意:ソースオブザーバブルがすでに「実行中」(他の何かによってサブスクライブされている)でありshare
、それらで使用している場合、この動作は表示されません。
さらに高度な注意:CombineLatestは常に各ソースから最新のものを提供するため、ソースオブザーバブルの1つが複数の値を出力する場合は、最新のものを取得します。ソースごとに1つの値を取得して、次の値に移動するだけではありません。各ソースオブザーバブルの「次の利用可能なアイテム」のみを取得する必要がある場合は.pipe(take(1))
、入力配列に追加するときにソースオブザーバブルに追加できます。
concat()
でcombineLatest()
やっているコード。Array.prototype.concat
RxJSconcat
メソッドではなく、メソッドのように見えます。私が正しいと仮定すると、この答えは誤解を招き、正しくありcombineLatest()
ません。オブザーバブルを1つずつ順番に実行しないからです。と同じように、それらを並行して実行しますforkJoin()
。違いは、生成される値の数と、ソースのオブザーバブルが完了する必要があるかどうかです。
[source].concat(observables)
、それが「combineLatest
内部的に使用するconcat
」と言ったときの意味であると仮定します。配列concatとRxJSconcatを混同しているように思えます。後者は実際に入力オブザーバブルを順番に実行し、それぞれが完了するまで待機します。しかしcombineLatest()
、それはによって使用されません、それは完全に別の演算子です。
combineLatest()
おり、forkJoin()
両方が並行して実行されます。以下のコードを実行すると、両方で約5000が出力されます。 const start = new Date().getTime();
combineLatest([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin-すべてのオブザーバブルが完了したら、それぞれから最後に発行された値を発行します。
CombineLatest-観測可能なものが値を放出するとき、それぞれから最新の値を放出します。
使用法は非常に似ていますが、forkJoinとは異なり、combineLatestの購読を解除することを忘れないでください 。
combineLatest()
とforkJoin()
、観察を作成する機能。それらは同じことをしますが、構文は異なります。混同しないでくださいcombineLatest
からrxjs/operators
「pipeable」演算子あります。間違ったものをインポートすると、エラーが発生します。