有一个不完整的observable,它可以有或没有重放n个值。我想从中得到最后一个值 - 或者如果还没有,那就是下一个值。
这适用于first()
和take(1)
(example)的第一个可用值:
possiblyReplayedIncomplteObservable.first().toPromise().then(val => ...);
但是对于最后一个值,last()
和takeLast(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(...)