Skip to content

結合系 Creation Functions

複数のObservableを1つのObservableに結合するための主要なCreation Functionsです。

結合系 Creation Functions とは

結合系のCreation Functionsは、複数のObservableを受け取り、それらを1つのObservableストリームにまとめます。結合方法によって、値の発行タイミングや順序が異なります。

以下の表で、各Creation Functionの特徴と使い分けを確認してください。

主要な結合系 Creation Functions

Function説明ユースケース
concat順次結合(前が完了後、次が開始)ステップバイステップ処理
merge並行結合(同時購読、発行順に出力)複数イベントの統合
combineLatest最新値を組み合わせフォーム入力の同期
zip対応する値をペア化リクエストとレスポンスの対応
forkJoinすべての完了を待って最終値を結合並列API呼び出しの完了待ち

使い分けの基準

結合系Creation Functionsの選択は、以下の観点で判断します。

1. 実行タイミング

  • 順次実行: concat - 前のObservableが完了してから次を開始
  • 並行実行: merge, combineLatest, zip, forkJoin - すべてのObservableを同時に購読

2. 値の発行方法

  • すべての値を発行: concat, merge - 各Observableから発行されたすべての値を出力
  • 最新値を組み合わせ: combineLatest - いずれかが値を発行するたびに、すべての最新値を組み合わせて発行
  • 対応する値をペア化: zip - 各Observableの対応する位置の値をペア化して発行
  • 最終値のみ: forkJoin - すべてのObservableが完了した時点で、各最終値を配列で発行

3. 完了のタイミング

  • すべて完了後: concat, forkJoin - すべてのObservableが完了するまで待つ
  • いずれか完了時: zip - いずれか1つが完了したら完了
  • 完了しない: merge, combineLatest - いずれかが完了しても、他が継続していれば完了しない

Cold から Hot への変換

上記の表に示した通り、全ての結合系Creation Functionsは Cold Observable を生成します。購読するたびに独立した実行が開始されます。

しかし、マルチキャスト系オペレーター(share(), shareReplay(), publish() など)を使用することで、Cold Observable を Hot Observable に変換できます。

実践例:HTTPリクエストの共有

typescript
import { merge, interval } from 'rxjs';
import { map, take, share } from 'rxjs';

// ❄️ Cold - 購読ごとに独立したHTTPリクエスト
const coldApi$ = merge(
  interval(1000).pipe(map(() => 'Source A'), take(3)),
  interval(1500).pipe(map(() => 'Source B'), take(2))
);

coldApi$.subscribe(val => console.log('購読者1:', val));
coldApi$.subscribe(val => console.log('購読者2:', val));
// → 各購読者が独立した interval を実行(2倍のリクエスト)

// 🔥 Hot - 購読者間で実行を共有
const hotApi$ = merge(
  interval(1000).pipe(map(() => 'Source A'), take(3)),
  interval(1500).pipe(map(() => 'Source B'), take(2))
).pipe(share());

hotApi$.subscribe(val => console.log('購読者1:', val));
hotApi$.subscribe(val => console.log('購読者2:', val));
// → 1つの interval を共有(リクエストは1回のみ)

TIP

Hot化が必要なケース:

  • 複数のコンポーネントで同じAPI結果を共有
  • forkJoin で並列リクエストした結果を複数箇所で使用
  • combineLatest で状態を管理し、複数の購読者に配信

詳しくは 基本作成系 - Cold から Hot への変換 を参照してください。

Pipeable Operator との対応関係

結合系Creation Functionsには、対応するPipeable Operatorが存在します。パイプラインの中で使用する場合は、~With系のオペレーターを使います。

Creation FunctionPipeable Operator
concat(a$, b$)a$.pipe(concatWith(b$))
merge(a$, b$)a$.pipe(mergeWith(b$))
zip(a$, b$)a$.pipe(zipWith(b$))
combineLatest([a$, b$])a$.pipe(combineLatestWith(b$))

次のステップ

各Creation Functionの詳細な動作と実践例を学ぶには、上記の表からリンクをクリックしてください。

また、選択・分割系 Creation Functions条件分岐系 Creation Functionsも併せて学習することで、Creation Functionsの全体像を理解できます。

Released under the CC-BY-4.0 license.