Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the last value from a ReplaySubject?

Tags:

rxjs

Below is a snippet that describes what I'm trying to do. In my application I have a replaysubject that's used throughout. At a certain point I want to get the last value emitted from the subject, but last doesn't seem to work on a ReplaySubject.

const subject = new Rx.ReplaySubject();

subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);

subject.subscribe(num => console.log(num));

var lastObserver = subject.last();
lastObserver.subscribe(num => console.log('last: ' + num));

FIDDLE

The code above doesn't fire anything for the lastObserver, but subscribe works just fine.

like image 731
Smeegs Avatar asked Sep 27 '17 00:09

Smeegs


1 Answers

Maybe your confusion is about how the .last() operator is supposed to work?

.last() should wait for a stream to complete, then give you the last value emitted before the stream ended. So in order for it to work, the stream will need to end.

I believe your lastObserver will emit as soon as the subject completes.

const subject = new Rx.ReplaySubject();

subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);

subject.subscribe(num => console.log(num));
subject.complete(); // end your stream here
var lastObserver = subject.last();
lastObserver.subscribe(num => console.log('last: ' + num));

If you don't want your stream to end, but you do want subscribers to receive the last value emitted before subscription, consider reaching for BehaviorSubject, which was designed for this use case.

like image 51
xtianjohns Avatar answered Sep 29 '22 09:09

xtianjohns