从不完整的observable获取最后一个值

时间:2016-10-26 19:53:10

标签: rxjs observable rxjs5

有一个不完整的observable,它可以有或没有重放n个值。我想从中得到最后一个值 - 或者如果还没有,那就是下一个值。

这适用于first()take(1)example)的第一个可用值:

possiblyReplayedIncomplteObservable.first().toPromise().then(val => ...);

但是对于最后一个值,last()takeLast(1)都等待可观察的完成 - 而不是这里的理想行为。

如何解决这个问题?是否有特定的运营商?

1 个答案:

答案 0 :(得分:4)

我有ReplaySubject(2)的解决方案'排水'获取最新元素的序列,如果序列为空,则只取最后一个元素,然而,它很麻烦且不能很好地扩展(例如,如果你决定将重放大小增加到3)。然后我记得重播/行为主题在管道输送时往往难以管理。最简单的解决方案是创造一个“影子”。序列并将ReplaySubject传递到其中(而不是通过ReplaySubject上的转换/操作创建它),因此:

var subject$ = new Rx.ReplaySubject(3);
var lastValue$ = new Rx.ReplaySubject(1);
subject$.subscribe(lastValue$); // short hand for subject$.subscribe(v => lastValue$.next(v))

lastValue$.take(1).toPromise().then(...);

==========旧解决方案,忽略ReplaySubject(2)=================

阅读下面的评论后,正确的代码是:

Rx.Observable.combineLatest(possiblyReplayedIncomplteObservable).take(1).subscribe(...)

而不是

Rx.Observable.combineLatest(possiblyReplayedIncomplteObservable).subscribe(...)

这是因为承诺是一次"一次"观察到的。我认为toPromise()代码仅在完成时解析结果。

take(1)不会影响您的原始流,因为它对combineLatest创建的新流进行操作。

实际上,最简单的方法是:

possiblyReplayedIncomplteObservable.take(1).toPromise().then(...)