RxJS の BehaviorSubject を share しようとして上手く行かなかったやつと上手く行ったやつ
以前はまったやつの備忘録 たぶん Angular 5.0.x, RxJS 5.5.x くらい
BehaviorSubject で Shared Service を作った時に、フィールドの Observable を直接参照するのではなく、メソッドを介して Observable を返す処理があった1
以下のように share した subject を分けると1度しか subscribe できない
import { Component, OnInit, Input } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { share, tap } from 'rxjs/operators'; @Component({ selector: 'my-app', template: ` <ul> <li>counter: {{counter}} <li>direct: {{direct|async}} <li>return: {{returnValue|async}} <li>direct2: {{direct|async}} <li>return2: {{returnValue|async}} </ul> `, }) export class AppComponent implements OnInit { direct: Observable<string>; returnValue: Observable<string>; message$: Observable<string>; subject: BehaviorSubject<string> = new BehaviorSubject<string>('initial'); counter: number = 0; ngOnInit() { this.message$ = this.subject.asObservable().pipe(tap(() => this.counter++), share()); this.direct = this.message$; this.returnValue = this.getObservable(); this.subject.next('Hello!'); } getObservable(): Observable<string> { return this.message$; } }
share しないと複数回呼べる
Observable の Cold/Hot についてまだちゃんと理解できてないと感じたので、改めて調べよう