結合(Combination)オペレーター
概要
結合オペレーターは、複数の Observable シーケンスを 1 つのシーケンスに統合するオペレーター群です。要素の組み合わせ方、タイミングの扱い方、購読の切り替え方によって、さまざまなバリエーションが用意されています。
オペレーター一覧
| オペレーター | 説明 |
|---|---|
| CombineLatest | いずれかのソースが発行するたびに、各ソースの最新値を組み合わせる |
| WithLatestFrom | メインソースが発行するときに、他方の最新値と組み合わせる |
| Merge | 複数の Observable の要素を届いた順に 1 つへ流す |
| Concat | 前の Observable が完了してから次の Observable を購読する |
| Zip | 各ソースの要素をインデックス順にペアリングする |
| ZipLatest | すべてのソースが新しい値を発行したときに最新値を組み合わせる |
| Switch | 最新の内部 Observable のみを購読し、以前の購読を破棄する |
| Race | 最初に値を発行した Observable のみを採用し、他はすべて解除する |
比較表
発行タイミングの違い
| オペレーター | 発行条件 | 値の消費 |
|---|---|---|
| CombineLatest | いずれかのソースが発行(全ソース発行済み後) | 最新値を再利用 |
| WithLatestFrom | メインソースが発行したとき | 他方の最新値を再利用 |
| Zip | すべてのソースに未消費の値があるとき | 各値を 1 回だけ消費 |
| ZipLatest | すべてのソースが前回以降に新しい値を発行したとき | 最新値を 1 回だけ消費 |
複数ソースの統合方法の違い
| オペレーター | 統合方法 | ソースの型 |
|---|---|---|
| Merge | 届いた順に統合 | 同一型 |
| Concat | 順番に直列化 | 同一型 |
| Switch | 最新の内部 Observable のみ | Observable<Observable<T>> |
| Race | 最初に値を出したソースのみ | 同一型 |
使い分けガイド
「複数ソースの最新値を常に組み合わせたい」→ CombineLatest
UI で複数のフォームフィールドをリアルタイムにバリデーションする場合などに適しています。
「メインの値が来たときだけ、参照用の最新値と組み合わせたい」→ WithLatestFrom
メインストリームの発行タイミングに従いつつ、補助情報を付加したい場合に使います。
「複数ソースの値を到着順に混ぜたい」→ Merge
複数のイベントソースを 1 つのストリームとして扱いたい場合に使います。
「複数ソースを順番に処理したい」→ Concat
前のシーケンスが完了してから次のシーケンスを開始したい場合に使います。
「1 対 1 でペアリングしたい」→ Zip
要素をインデックス順で対にし、すべての値を漏れなく処理したい場合に使います。
「すべてのソースが更新されるたびに最新値を組み合わせたい」→ ZipLatest
各ソースの「最新の更新」を同期的に処理したい場合に使います。
「最新のソースだけに切り替えたい」→ Switch
検索候補のオートコンプリートなど、新しいリクエストが来たら古いリクエストをキャンセルしたい場合に使います。
「最速のソースだけを使いたい」→ Race
複数のサーバーにリクエストを送り、最初に応答したものを採用する場合に使います。