Angular 2でアプリを書いています。いくつかのhttpリクエストを実行し、レスポンスに対して関数を実行したいと思います。
Angular 1、私は$q.all([$http.get(...), $http.get(...), ...]).then(doSomethingWithResponses);
のようなものを書くでしょう
しかし、Angular 2はRxJS Observablesを返しますが、たくさん読んだ後でも、いくつかのhttpリクエストの応答を取得する方法がわかりません。これを行うにはどうすればよいですか?
@Eric Martinezが指摘したように、 forkJoin があります。 forkJoinは、すべての観測可能なシーケンスを並行して実行し、最後の要素を収集します。
Rx.Observable.forkJoin([a,b]).subscribe(t=> {
var firstResult = t[0];
var secondResult = t[1];
});
forkJoin/Zip
を使用するかどうかはわかりませんが、特に combineLatest
の方が理解しやすく、すべてのサブforkJoin
は基本的に、放出されたすべてのサブストリームでサンプリングします。
これは、後で複数項目のObservableを組み合わせたい場合に噛み付くようになるかもしれません。
merge
は機能しませんか? onComplete
コールバックにハンドラーをサブスクライブしてアタッチできます。
まず、オブザーバブルの配列を作成してから、静的merge
を使用します。
let obs_ary: any = [obs1, obs2, obs3];
Observable.merge(...obs_ary);
私は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'));