寝て起きて寝て

プログラミングが出来ない情報系のブログ

RxJSのSubjectメモ

Subjectとは

通常subscribeしたタイミングでデータは流れていってしまう またobservalだけでは1度しか実行することができない

任意のタイミングでデータを流したい場合に使える機能

これはobservableを継承していて任意のタイミングでデータを流せる特徴を持っている

またsubscribeするときにコールバックを含む処理のことをオブザーバーと呼ぶ 下のnext部分

subject.subscribe({
next: v => console.log(`observerA: ${v}`)
})

これはイベントリスナーのようなものでこの配列を保持している

配列とはどういうことかというと 下記のような場合ログではobserverAとBがそれぞれ1回ずつ動いていることがわかる つまり上書きされない

nextメソッドを実行するとObservableのストリームが流れる 引数に指定したデータが流れる

const subject = new Subject<number>();
 
subject.subscribe({
  next: (v) => console.log(`observerA: ${v}`)
});
subject.subscribe({
  next: (v) => console.log(`observerB: ${v}`)
});
 
subject.next(1);
subject.next(2);
// Logs:
// observerA: 1
// observerB: 1
// observerA: 2
// observerB: 2

開発では Observable単体よりもSubjectを使用することが多い

Subjectの使い方

service側でSubjectを初期化して、Componentからservice経由でSubjectを監視する。 そして任意のタイミング(ボタン押下など)でSubjectがストリームでデータを流して 複数のComponentへ変更を伝える

サービスの実装例

private searchTerms = new Subject<string>()
public searchTerms$ = this.searchTerms.asObservable()

public search(term:string): void{
  this.searchTerms.next(term)
}

上の例では Subject型のsearchTermsを初期化して保持する 次に任意のタイミングで実行できるようにsearchメソッドを定義して その中でnextメソッドを実行する。

そして他のコンポーネントから参照できるように asObservableメソッドを使い、publicでsearchTerms$を定義する これをするとObservableを取得できるようになる 直接nextを呼べないようにする(setter的な意味を持たせるような処理)

コンポーネントの実装例

コンポーネントでは該当のサービスを宣言して、 任意のタイミングで呼び出せるようにsearchメソッドを実行する

construcotr(
  private searchService:SearchService,
  private memberService: MemberService
){}

search(term: string): void{
  this.searchService.search(term)
}