RxJS Subject 比較解説
AngularにおけるSubject、BehaviorSubject、ReplaySubjectの比較
Subject、BehaviorSubject、ReplaySubjectは、RxJSの重要な概念であり、Angularアプリケーションで頻繁に使用されます。これらの型は、オブザーバブルパターンを実装し、複数のオブザーバが値を購読できるようにします。
Subject
- 用途
- 動作
- 新しい値が発行されると、その値が購読しているオブザーバに通知されます。
- 購読が開始された後に発行された値のみが通知されます。
- 定義
最も基本的なSubject型です。
BehaviorSubject
- 用途
- 動作
- 購読が開始されると、最新の値が直ちに通知されます。
- その後、新しい値が発行されると、同様に通知されます。
- 定義
Subjectを拡張し、初期値を保持する型です。
ReplaySubject
- 用途
- 定義
Subjectを拡張し、バッファリング機能を持つ型です。
コード例
import { Subject, BehaviorSubject, ReplaySubject } from 'rxjs';
// Subject
const subject = new Subject<number>();
subject.subscribe(value => console.log('Subject:', value));
subject.next(1);
subject.next(2);
// BehaviorSubject
const behaviorSubject = new BehaviorSubject<number>(0);
behaviorSubject.subscribe(value => console.log('BehaviorS ubject:', value));
behaviorSubject.next(1);
behaviorSubject.next(2);
// ReplaySubject
const replaySubject = new ReplaySubject<number>(2); // バッファサイズを2に設定
replaySubject.subscribe(value => console.log('ReplaySubject:', value));
replaySubject.next(1);
replaySubject.next(2);
replaySubject.next(3);
- ReplaySubject
バッファリングと過去の値の通知。 - BehaviorSubject
初期値の設定と最新の値の保持。 - Subject
基本的な値の配信。
import { Subject, BehaviorSubject, ReplaySubject } from 'rxjs';
// Subject
const subject = new Subject<number>();
subject.subscribe(value => console.log('Subject:', value));
subject.next(1);
subject.next(2);
// BehaviorSubject
const behaviorSubject = new BehaviorSubject<number>(0);
behaviorSubject.subscribe(value => console.log('BehaviorS ubject:', value));
behaviorSubject.next(1);
behaviorSubject.next(2);
// ReplaySubject
const replaySubject = new ReplaySubject<number>(2); // バッファサイズを2に設定
replaySubject.subscribe(value => console.log('ReplaySubject:', value));
replaySubject.next(1);
replaySubject.next(2);
replaySubject.next(3);
import { Subject, BehaviorSubject, ReplaySubject } from 'rxjs';
// Subject
const subject = new Subject<number>();
subject.subscribe(value => console.log('Subject:', value));
subject.next(1);
subject.next(2);
// BehaviorSubject
const behaviorSubject = new BehaviorSubject<number>(0);
behaviorSubject.subscribe(value => console.log('BehaviorS ubject:', value));
behaviorSubject.next(1);
behaviorSubject.next(2);
// ReplaySubject
const replaySubject = new ReplaySubject<number>(2); // バッファサイズを2に設定
replaySubject.subscribe(value => console.log('ReplaySubject:', value));
replaySubject.next(1);
replaySubject.next(2);
replaySubject.next(3);
他のアプローチ
これらの型以外にも、RxJSにはさまざまなアプローチがあります。
Observable.create
- 用途
複雑なロジックや非同期操作を実装する場合に使用されます。 - 定義
カスタムのオブザーバブルを作成するメソッドです。
import { Observable } from 'rxjs';
const observable = new Observable(observer => {
// 値を発行するロジック
observer.next(1);
observer.next(2);
observer.complete();
});
- 用途
配列をオブザーバブルに変換する場合に使用されます。 - 定義
配列やイテラブルからオブザーバブルを作成するメソッドです。
import { Observable } from 'rxjs';
const numbers = [1, 2, 3];
const observable = Observable.from(numbers);
import { Observable } from 'rxjs';
const observable = Observable.of(1, 2, 3);
combineLatest
- 用途
複数のデータストリームを同時に監視する場合に使用されます。 - 定義
複数のオブザーバブルの最新の値を結合するメソッドです。
import { combineLatest } from 'rxjs';
const observable1 = Observable.of(1, 2, 3);
const observable2 = Observable.of('a', 'b', 'c');
combineLatest(observable1, observable2).subscribe(values => console.log(values));
javascript angular rxjs