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

kdu*_*kdu 30 observable rxjs typescript angular

我有两个需要通过服务共享数据的Angular2组件:

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

  setSearchResults(_searchResult: string): void {
    this.searchResultSource.next(_searchResult)
  }
}
Run Code Online (Sandbox Code Playgroud)

假设ComponentA已呈现并且它通过发出事件SearchService.setSearchResults.然后用户导航到ComponentB,也订阅searchResult$.但是,ComponentB永远不会观察发出的事件,ComponentA因为它searchResult$ComponentA发出事件时没有订阅,因为它不存在.

如何创建Observable向每个新订阅者发送最后一个事件的内容?

Gün*_*uer 45

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

@Injectable()
export class SearchService {

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

  setSearchResults(_searchResult: string): void {
      this.searchResultSource.next(_searchResult);
  }
}
Run Code Online (Sandbox Code Playgroud)

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


tib*_*bus 12

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

@Injectable()
export class SearchService {

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

  setSearchResults(_searchResult: string): void {
      this.searchResultSource.next(_searchResult);
  }
}
Run Code Online (Sandbox Code Playgroud)

只是正常订阅.可以在此处找到
更高级的示例:使用angular2 http服务缓存结果

  • 我对Rx的东西和可观察物还是很陌生(这不是我们所有人吗?!),但是这个答案对我很有帮助。对于处于我位置的任何人……我最初选择了一个“ ReplaySubject”(与“ BehaviorSubject”相对),因为您无需使用值初始化“ ReplaySubject”。但是,订阅默认情况下可观察到的“ ReplaySubject”将为您提供在其生存期内广播的所有值。像在@tibbus答案中那样以1的缓冲区大小初始化`ReplaySubject`对我有用! (3认同)