如何“重播”最后一个发射项目给每个用户?

时间:2017-02-20 19:14:43

标签: rxjs observable

在RxJS中,我希望为每个新订阅者提供最后发出的项目。但是我如何在Observable链中做到这一点?

this.http.get().map().replaySubject().refCount()

1 个答案:

答案 0 :(得分:5)

这个答案涉及 RxJS 5

一种方法是使用publishReplay

this.http
  .get()
  .map()
  .publishReplay(1)
  .refCount();

如果你的来源是一个来源,那就完成了(这是休息电话的典型情况,因为它在收到回复后完成),你也可以使用publishLast

this.http
  .get()
  .map()
  .publishLast()
  .refCount();

第三种方式(为您提供最大的灵活性)是使用外部BehaviorSubjectReplaySubject

public myData$: BehaviorSubject<any> = new BehaviorSubject(null); // initial value is "null"

public requestData(): BehaviorSubject<any> {
    this.http
       .get()
       .map()
       .do(data => this.myData$.next(data))
       .subscribe();

    return this.myData$.skip(1); // the returned subject skips 1, because this would be the current value - of course the skip is optional and depends on the implementation of the requesting component
}

在您的组件中,您可以通过myData$.subscribe(...)获取数据以获取当前“缓存”的数据,或通过requestData().subscribe(...)获取最新数据。