RxJS は、JavaScirpt でリアクティブ・プログラミングを行うライブラリであり、非同期処理やタイマー処理、イベント駆動の処理を簡潔かつ可読性高くコーディング出来きます。
zip
RxJS の zip は、複数の Observable を受け取り、それらを組み合わせた Observable を返す operator です。
簡単なサンプルコード
とにかく、zip を使ってみましょう。
次の例は、それぞれ 3つの値のリストを持つ Observable を、zip で組み合わせるサンプルコードだ。
import { of, zip } from 'rxjs';
const src1 = of(1, 2, 3);
const src2 = of(4, 5, 6);
zip(src1, src2).subscribe(console.log);
実行結果は次のとおり。
2つのリストの値が組み合わせた配列が、subscribe に渡される。
[1, 4]
[2, 5]
[3, 6]
zip を色々ためす
3つの Observable
zip は、複数の Observable を受け取るため、3 つ以上の Observable を渡すこともできる。
const src1 = of(1, 2, 3);
const src2 = of(4, 5, 6);
const src3 = of(7, 8, 9);
zip(src1, src2, src3).subscribe(console.log);
上のコードを実行すると、こんな感じに 3つの Observable が組み合わされた配列が subscribe に渡される。
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
リストの数が違うとき
zip は、複数の Observable を受け取り、それらを組み合わせた Observable を返すが、リストの数が違う Observable を渡した時は、どうなるのだろうか?
実際に、リストの数が違う Observable を 2つ zip に渡してみる。
const src1 = of(1, 2, 3);
const src2 = of(4, 5);
zip(src1, src2).subscribe({
next: (x) => console.log(x),
complete: () => console.log('complete'),
});
実行すると、要素数が一致する部分までが組み合わせられ、一致しない部分(この例では src1 の 3要素目)は捨てられ complete が呼ばれる。
[1, 4]
[2, 5]
complete
つまり zip は、渡された複数の Observable から、いずれかのソースがなくなるまで、next で値を取り出し、どれか1つでも値がなくって complete になった時点で zip の流れも止まるオペレーターといった感じだろう。
ajax と zip
ajax と zip を組み合わせると、複数の API 呼び出しの待ち合わせなどに使える。
例えば、つぎのようなコードを書くことで、ajax1 と ajax2 の非同期通信が完了するまで待ち合わせて、subscribe で2つのレスポンスを使って処理を行うといったことが可能になる。
import { zip } from 'rxjs';
import { ajax } from 'rxjs/ajax';
const ajax1 = ajax(`https://api.github.com/users?per_page=1`);
const ajax2 = ajax(`https://api.github.com/404`);
zip(ajax1, ajax2)
.subscribe((res) => console.log(res));
エラーハンドリングしたい時は、error を使えばよいが、注意点としては、複数の ajax 処理でエラーになった時でも、error は最初に発生したエラーしか呼ばれない。
zip(ajax1, ajax2).subscribe({
next: (res) => console.log(res),
error: (err) => console.log(err)
});

0 件のコメント:
コメントを投稿