Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to "replay" the last emitted item to each subscriber?

In RxJS I want to give every new subscriber the last item that was emitted. But how do I do that in an Observable chain?

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

like image 677
Arlen Beiler Avatar asked Oct 22 '25 08:10

Arlen Beiler


1 Answers

This answer refers to RxJS 5:

One way would be to use publishReplay:

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

If your source is a source, that completes (which would be typical for a rest-call, since it completes after a response is received), you could also use publishLast:

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

And a third way (which gives you the most flexibility) would be to use an external BehaviorSubject or a ReplaySubject:

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
}

In your component(s) you can the get the data via myData$.subscribe(...) for getting the currently "cached" data or via requestData().subscribe(...) for the latest data.

like image 162
olsn Avatar answered Oct 26 '25 22:10

olsn