我有一个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(...)
难道你们就不能使用其他重播观察的 - 使用相同的源 - 有一个重播的价值,而不是N个值?那是你正在寻找的行为,对吧? – cartant