RxJS ObservableとSubjectの違い
Observableは、データのストリームを表すものです。データが流れると、購読しているオブザーバーに通知されます。Observable自体はデータの生成や制御は行いません。
Subjectは、Observableの特殊な種類で、データの発行と購読の両方が可能です。つまり、Subjectはデータのストリームを生成し、そのストリームを複数のオブザーバーに配信することができます。
主な違い
-
購読
- Observable: 複数のオブザーバーが独立して購読できます。各オブザーバーは独自のデータストリームを受け取ります。
- Subject: 複数のオブザーバーが同じSubjectを購読すると、同じデータストリームを共有します。
-
データの生成
- Observable: データの生成はObservableの定義内に実装されます。
- Subject: Subject自体がデータを生成し、
next()
メソッドを使って値を発行します。
使用例
-
Subject
- コンポーネント間の状態を共有する
- イベントバスとして使用する
- カスタムイベントを配信する
-
Observable
- HTTPリクエストの結果を配信する
- タイマーイベントを配信する
- ユーザーの入力イベントを配信する
// Observable
import { interval } from 'rxjs';
const source = interval(1000); // Emits numbers every second
const subscribe = source.subscribe(val => console.log(val));
// Subject
import { Subject } from 'rxjs';
const subject = new Subject();
subject.subscribe(val => console.log('Observer A: ' + val));
subject.subscribe(val => console.log('Observer B: ' + val));
subject.next(1);
subject.next(2);
subject.next(3);
解説
Observableの例では、interval
関数を使って1秒ごとに数値を発行するObservableを作成しています。このObservableを購読すると、購読者は1秒ごとに数値を受け取ります。
Subjectの例では、Subject
オブジェクトを作成し、複数のオブザーバーを購読させています。next()
メソッドを使ってSubjectに値を発行すると、すべての購読者がその値を受け取ります。
違いのポイント
-
- Observableの購読者は独立しています。各購読者は独自のデータストリームを受け取ります。
- Subjectの購読者は同じデータストリームを共有します。
-
- Observableは外部のデータ源(タイマー、HTTPリクエストなど)からデータを取得します。
- Subjectは内部的にデータを生成し、
next()
メソッドで発行します。
ObservableとSubjectは、RxJSにおける重要な概念ですが、状況によっては他のアプローチも考慮することができます。
BehaviorSubject
- 使用例
- キャッシュされたデータの管理
- 特徴
- 初期値を持ち、購読時に最新の値をすぐに配信します。
- 値が更新されると、すべての購読者に新しい値が配信されます。
ReplaySubject
- 使用例
- 過去の一定期間のデータ履歴を保持する
- 再生可能なデータストリームを作成する
- 特徴
AsyncSubject
- 使用例
- 最終的な結果のみが必要な場合
- エラー処理の際の最終的なエラーメッセージの配信
- 特徴
選択の基準
- 最終的な結果
- データの履歴
- データの共有
javascript angular rxjs