web-dev-qa-db-ja.com

Rxjs:Observable.combineLatestとObservable.forkJoin

Observable.combineLatestObservable.forkJoinの違いは何ですか?私が見る限り、唯一の違いはforkJoinはObservablesが完了することを期待しているのに対し、combineLatestは最新の値を返すことです。

52
Tuong Le

forkJoinは、すべての入力オブザーバブルを完了する必要があるだけでなく、入力オブザーバブルによって生成された最後の値の配列である単一の値を生成するオブザーバブルを返します。つまり、最後の入力オブザーバブルが完了するまで待機し、単一の値を生成して完了します。

対照的に、combineLatestは、すべての入力オブザーバブルが少なくとも1つの値を生成すると、入力オブザーバブルが実行されるたびに新しい値を生成するObservableを返します。これは、無限の値を持つ可能性があり、完了しない可能性があることを意味します。また、値を生成する前に入力オブザーバブルを完了する必要がないことも意味します。

88
GregL

また:

composeLatest(...)は、オブザーバブルを1つずつ順番に実行します

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)); };
_

forkJoin(...)は同時にオブザーバブルを実行します

3つのソースオブザーバブルがあり、それぞれの実行に5秒かかる場合、combineLatestの実行には15秒かかります。 forkJoinは並行して実行されるため、5秒かかります。

したがって、forkJoinは、順序が強制されないPromise.all(...)のように機能します。

エラー処理に関する考慮事項:

オブザーバブルのいずれかがエラーになった場合-combineLatestの場合、後続のものは実行されませんが、forkJoinの場合はすべて実行されます。したがって、combineLatestは、オブザーバブルの「シーケンス」を実行し、結果をまとめて収集するのに役立ちます。


高度な注意:ソースオブザーバブルが既に「実行中」(他の何かによってサブスクライブされている)で、それらでshareを使用している場合、この動作は表示されません。

さらに高度な注意:CombineLatestは常に各ソースの最新情報を提供するため、ソースオブザーバブルの1つが複数の値を出力する場合、最新の情報が取得されます。各ソースに対して単一の値を取得して次の値に移動するだけではありません。各ソースオブザーバブルの「次の利用可能なアイテム」のみを取得する必要がある場合は、入力配列に追加するときに.pipe(take(1))をソースオブザーバブルに追加できます。

8
Simon_Weaver

forkJoin-すべてのオブザーバブルが完了したら、それぞれから最後に発行された値を発行します。

combineLatest-オブザーバブルが値を出力する場合、それぞれから最新の値を出力します。

使用方法はかなり似ていますが、forkJoinとは異なり、combineLatestから登録解除することを忘れないでください。

1
Dmitry Grinko