首页 文章

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

提问于
浏览
20

我有两个需要通过服务共享数据的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 发出的事件,因为它在 ComponentA 发出事件时没有订阅 searchResult$ ,因为它不存在 .

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

2 回答

  • 31

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

    @Injectable()
    export class SearchService {
    
      private searchResultSource = new BehaviorSubject<string>('');
    
      setSearchResults(_searchResult: string): void {
          this.searchResultSource.next(_searchResult);
      }
    }
    

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

  • 10

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

相关问题