Skip to content

combineLatest - 最新の値を組み合わせる

combineLatest オペレーターは、複数のObservableの最新の値をすべてまとめて出力します。
いずれかのソースObservableから新しい値が発行されるたびに、すべての最新値をまとめた結果が発行されます。

🔰 基本構文と使い方

ts
import { combineLatest, of } from 'rxjs';

const obs1$ = of('A', 'B', 'C');
const obs2$ = of(1, 2, 3);

combineLatest([obs1$, obs2$]).subscribe(([val1, val2]) => {
  console.log(val1, val2);
});

// 出力:
// C 1
// C 2
// C 3
  • 各Observableが少なくとも1つ値を発行してから、組み合わせた値が出力されます。
  • どちらか一方に新しい値が来るたびに、最新のペアが再出力されます。

🌐 RxJS公式ドキュメント - combineLatest

💡 典型的な活用パターン

  • フォーム入力のリアルタイム検証(例: 名前とメールアドレスを同時監視)
  • 複数ストリームの状態同期(例: センサー値やデバイスステータスの統合)
  • 依存関係のあるデータフェッチ(例: ユーザーIDと設定IDの組み合わせ)

🧠 実践コード例(UI付き)

フォームの2つの入力フィールドの最新状態を常に組み合わせて表示します。

ts
import { combineLatest, fromEvent } from 'rxjs';
import { map, startWith } from 'rxjs/operators';

// 出力エリア作成
const output = document.createElement('div');
output.innerHTML = '<h3>combineLatest の実践例:</h3>';
document.body.appendChild(output);

// フォームフィールド作成
const nameInput = document.createElement('input');
nameInput.placeholder = '名前を入力';
document.body.appendChild(nameInput);

const emailInput = document.createElement('input');
emailInput.placeholder = 'メールを入力';
document.body.appendChild(emailInput);

// 各入力のObservable
const name$ = fromEvent(nameInput, 'input').pipe(
  map(e => (e.target as HTMLInputElement).value),
  startWith('')
);

const email$ = fromEvent(emailInput, 'input').pipe(
  map(e => (e.target as HTMLInputElement).value),
  startWith('')
);

// 最新の入力値を結合
combineLatest([name$, email$]).subscribe(([name, email]) => {
  output.innerHTML = `
    <div><strong>名前:</strong> ${name}</div>
    <div><strong>メール:</strong> ${email}</div>
  `;
});
  • いずれかのフィールドに入力すると、最新の2つの入力状態が即座に表示されます。
  • startWith('') を使うことで、最初から組み合わせ結果を得られるようにしています。

Released under the CC-BY-4.0 license.