1. ホーム
  2. javascript

RXJS 配列のすべての観測値が完了するのを待つ(またはエラー)

2023-08-01 11:34:32

質問

こんな感じで、observableを配列にプッシュしているのですが...。

var tasks$ = [];
tasks$.push(Observable.timer(1000));
tasks$.push(Observable.timer(3000));
tasks$.push(Observable.timer(10000));

すべてのtasks$が完了したときにemitするObservableが欲しい。 実際には、tasks$は既知の数のObservableを持っていないことを覚えておいてください。

試しに Observable.zip(tasks$).subscribe() を試してみましたが、これはタスクが1つしかない場合に失敗するようで、私が期待する方法で動作するために、ZIPは偶数の要素を必要とすると私に思わせています。

私が試したのは Observable.concat(tasks$).subscribe() を試してみましたが、concatオペレータの結果は、observableの配列にしかなりません。 例えば、基本的に入力と同じです。それに対してsubscribeを呼び出すこともできません。

C#では、これは次のようなものです。 Task.WhenAll() . ES6 promiseでは、これは Promise.all() .

私は多くのSOの質問に出会いましたが、それらはすべて、既知の数のストリームを待つこと(たとえば、それらを一緒にマッピングすること)に対処しているように見えます。

どのように解決するのですか?

すべてのソース observable が完了したときにemitするような observable を構成したい場合は forkJoin :

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';
import 'rxjs/add/operator/first';

var tasks$ = [];
tasks$.push(Observable.timer(1000).first());
tasks$.push(Observable.timer(3000).first());
tasks$.push(Observable.timer(10000).first());
Observable.forkJoin(...tasks$).subscribe(results => { console.log(results); });