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

时间:2016-05-11 22:56:06

标签: angular typescript rxjs observable

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

1

假设呈现@Injectable() export class SearchService { private searchResultSource = new Subject<string>() searchResult$ = this.searchResultSource.asObservable() setSearchResults(_searchResult: string): void { this.searchResultSource.next(_searchResult) } } 并通过ComponentA发出事件。然后,用户导航到SearchService.setSearchResultsComponentB也订阅searchResult$。但是,ComponentB永远不会观察ComponentA发出的事件,因为它searchResult$ComponentA发出事件时没有订阅,因为它不存在。

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

2 个答案:

答案 0 :(得分:36)

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

@Injectable()
export class SearchService {

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

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

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

答案 1 :(得分:11)

您可以使用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