Skip to content

結合(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

複数のサーバーにリクエストを送り、最初に応答したものを採用する場合に使います。