How do I get the last value from a ReplaySubject?

17,025

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.

Share:
17,025
Smeegs
Author by

Smeegs

Updated on June 15, 2022

Comments

  • Smeegs
    Smeegs almost 2 years

    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.

  • Admin
    Admin almost 2 years
    As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.