RxJSにおけるBehaviorSubjectとObservableの違い
BehaviorSubjectとObservableの違い (JavaScript, Angular, RxJS)
BehaviorSubject と Observable はどちらも RxJS で扱うデータストリームを表しますが、重要な違いがあります。
Observable
- 新しい値が発行されるたびに購読者に通知
Observable は新しい値が発行されるたびに、全ての購読者にその値を通知します。 - 購読時に最新の値を発行
購読者が購読すると、その時点での最新の値が発行されます。 - 初期値を持たない
Observable は購読されるまで値を保持しません。
BehaviorSubject
- 購読時に最新の値を発行
Observable と同様に、購読時に最新の値を発行します。 - 初期値を持つ
BehaviorSubject は初期値を保持します。
要約
- 購読時の値
BehaviorSubject は購読時に初期値を発行し、Observable は最新の値を発行します。 - 初期値
BehaviorSubject は初期値を持ち、Observable は持ちません。
Angularでの使用例
import { BehaviorSubject, Observable } from 'rxjs';
// BehaviorSubjectの例
const subject = new BehaviorSubject<number>(0);
subject.next(1); // 値を更新
subject.subscribe(value => console.log(value)); // 購読すると初期値0と更新された値1が出力されます
// Observableの例
const observable = new Observable<number>(observer => {
observer.next(2);
observer.next(3);
});
observable.subscribe(value => console.log(value)); // 購読すると値2と3が出力されます
BehaviorSubjectとObservableの例 (RxJS)
import { BehaviorSubject } from 'rxjs';
// 初期値として10を指定したBehaviorSubjectを作成
const subject = new BehaviorSubject<number>(10);
// 購読する
subject.subscribe(value => {
console.log('BehaviorSubject:', value);
});
// 値を更新する
subject.next(20);
subject.next(30);
出力
BehaviorSubject: 10
BehaviorSubject: 20
BehaviorSubject: 30
import { Observable } from 'rxjs';
// Observableを作成
const observable = new Observable<number>(observer => {
observer.next(100);
observer.next(200);
observer.complete();
});
// 購読する
observable.subscribe(value => {
console.log('Observable:', value);
}, error => {
console.error('Error:', error);
}, () => {
console.log('Completed');
});
Observable: 100
Observable: 200
Completed
比較
- Observable
- 初期値を持たない。
- 購読時に最新の値を発行する。
- 値が発行されるたびに、全ての購読者に通知される。
- BehaviorSubject
- 初期値を持つ。
ポイント
- Observableは、値が発行されるタイミングを制御したい場合や、エラー処理や完了処理が必要な場合に適している。
- BehaviorSubjectは、初期値が必要な場合や、購読者が購読する前に値を発行したい場合に適している。
ReplaySubject
- 購読時に過去の値を発行
購読者が購読すると、過去の値を全て発行します。 - 過去の値を保持
ReplaySubjectは、指定されたバッファサイズに基づいて過去の値を保持します。
AsyncSubject
- 購読者が購読する前に完了した場合
購読者が購読する前にObservableが完了した場合、購読者は何も受け取りません。 - 完了時に最後の値を発行
Observableが完了すると、最後の値を発行します。 - 最後の値のみを発行
AsyncSubjectは、最後の値のみを発行します。
Subject
- 初期値を持たない
Subjectは初期値を持ちません。 - 最も基本的なSubject
Subjectは、BehaviorSubjectとObservableの両方の特性を備えています。
使用例
import { BehaviorSubject, Observable, ReplaySubject, AsyncSubject, Subject } from 'rxjs';
// ReplaySubjectの例
const replaySubject = new ReplaySubject<number>(2); // バッファサイズを2に設定
replaySubject.next(1);
replaySubject.next(2);
replaySubject.next(3);
replaySubject.subscribe(value => console.log('ReplaySubject:', value)); // 出力: ReplaySubject: 2, ReplaySubject: 3
// AsyncSubjectの例
const asyncSubject = new AsyncSubject<number>();
asyncSubject.next(10);
asyncSubject.next(20);
asyncSubject.complete();
asyncSubject.subscribe(value => console.log('AsyncSubject:', value)); // 出力: AsyncSubject: 20
// Subjectの例
const subject = new Subject<number>();
subject.next(100);
subject.next(200);
subject.subscribe(value => console.log('Subject:', value)); // 出力: Subject: 200
選択基準
- 基本的なSubjectが必要か
Subjectを使用。 - 最後の値のみを発行したいか
AsyncSubjectを使用。 - 過去の値を保持したいか
ReplaySubjectを使用。 - 初期値が必要か
BehaviorSubjectを使用。
javascript angular rxjs