web-dev-qa-db-ja.com

Observableにサブスクライブするときに最後の値を取得する方法は?

サービスを介してデータを共有する必要がある2つのAngular2コンポーネントがあります。

@Injectable()
export class SearchService {
  private searchResultSource = new Subject<string>()
  searchResult$ = this.searchResultSource.asObservable()

  setSearchResults(_searchResult: string): void {
    this.searchResultSource.next(_searchResult)
  }
}

ComponentAがレンダリングされ、SearchService.setSearchResultsを介してイベントを発行するとします。次に、ユーザーはComponentBに移動します。これは、searchResult$にもサブスクライブします。ただし、ComponentBは、ComponentAがイベントを発行した時点でsearchResult$にサブスクライブされていなかったため、ComponentAによって発行されたイベントを監視しません。

新しいサブスクライバーごとに最後のイベントを発行するObservableを作成するにはどうすればよいですか?

29
kdu

BehaviorSubjectはすぐに新しいサブスクライバーに最後の値を送信します。

@Injectable()
export class SearchService {

  private searchResultSource = new BehaviorSubject<string>('');

  setSearchResults(_searchResult: string): void {
      this.searchResultSource.next(_searchResult);
  }
}

ReplaySubjectは、以前のすべてのイベントを新しいサブスクライバーに発行します。

41

ReplaySubject を使用して、常に次のようなObserverの最後の値を取得できます。

@Injectable()
export class SearchService {

  private searchResultSource = new ReplaySubject<string>(1);

  setSearchResults(_searchResult: string): void {
      this.searchResultSource.next(_searchResult);
  }
}

そして、通常どおり購読するだけです。
より高度な はここにあります: angular2 httpサービスでのキャッシュ結果

12
tibbus