web-dev-qa-db-ja.com

RxJSでの.all()の約束

Angular 2でアプリを書いています。いくつかのhttpリクエストを実行し、レスポンスに対して関数を実行したいと思います。

Angular 1、私は$q.all([$http.get(...), $http.get(...), ...]).then(doSomethingWithResponses);のようなものを書くでしょう

しかし、Angular 2はRxJS Observablesを返しますが、たくさん読んだ後でも、いくつかのhttpリクエストの応答を取得する方法がわかりません。これを行うにはどうすればよいですか?

17
benshope

@Eric Martinezが指摘したように、 forkJoin があります。 forkJoinは、すべての観測可能なシーケンスを並行して実行し、最後の要素を収集します。

Rx.Observable.forkJoin([a,b]).subscribe(t=> {
        var firstResult = t[0];
        var secondResult = t[1];
});
32
pixelbits

forkJoin/Zip を使用するかどうかはわかりませんが、特に combineLatest の方が理解しやすく、すべてのサブforkJoinは基本的に、放出されたすべてのサブストリームでサンプリングします。

これは、後で複数項目のObservableを組み合わせたい場合に噛み付くようになるかもしれません。

7
kakigoori

mergeは機能しませんか? onCompleteコールバックにハンドラーをサブスクライブしてアタッチできます。

まず、オブザーバブルの配列を作成してから、静的mergeを使用します。

let obs_ary: any = [obs1, obs2, obs3];
Observable.merge(...obs_ary);
2
flyer88

私はRxJSを学んでおり、RxJS v5でも同じことをしようとしていました

V5にはforkJoinがもうないようですので、ここでそれをどのように動作させるかを示します(エイリアスであるflatMapまたはmergeMapで動作します)。

const callOne = value =>
    new window.Promise(resolve =>
        setTimeout(() => resolve(value + 10), 3000)
    );

const callTwo = value =>
    new window.Promise(resolve =>
        setTimeout(() => resolve(value + 20), 1000)
    );

Rx.Observable
    .of(2)
    .do(() => console.log('querying...'))
    .mergeMap(number =>
        Rx.Observable.Zip(
            Rx.Observable.fromPromise(callOne(number)),
            Rx.Observable.fromPromise(callTwo(number))
        )
    ).concatAll()
    .subscribe(createSubscriber('promises in parallel'));
1
rafaelbiten