如何从 ReplaySubject 获取最后一个值?

Sme*_*egs 5 rxjs

下面是一个描述我正在尝试做的事情的片段。在我的应用程序中,我有一个贯穿始终的 replaysubject。在某个时候,我想获得从主题发出的最后一个值,但last似乎不适用于 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));
Run Code Online (Sandbox Code Playgroud)

小提琴

上面的代码不会为 触发任何东西lastObserver,但 subscribe 工作得很好。

小智 11

也许您的困惑是关于.last()操作员应该如何工作?

.last()应该等待流完成,然后为您提供流结束前发出的最后一个值。所以为了让它工作,流需要结束。

我相信你lastObserver会在主题完成后立即发出。

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));
Run Code Online (Sandbox Code Playgroud)

如果您不希望流结束,但确实希望订阅者接收订阅前发出的最后一个值,请考虑使用 for BehaviorSubject,它是为此用例设计的。