订阅Observable时如何获得最后一个值?

问题描述 投票:24回答: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,它向每个新订阅者发送最后一个事件?

angular typescript rxjs observable
2个回答
36
投票

BehaviorSubject立即向新订阅者发出最后一个值:

@Injectable()
export class SearchService {

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

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

ReplaySubject向新订阅者发送所有先前的事件。


12
投票

您可以使用ReplaySubject始终获取Observer的最后一个值,如下所示:

@Injectable()
export class SearchService {

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

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

并且只是正常订阅。 在这里可以找到更高级的examplecaching results with angular2 http service

© www.soinside.com 2019 - 2024. All rights reserved.