2016-10-26 28 views
2

有一个不完整的可观察值,它可以有或没有n值的重播。我想从中获得最后的价值 - 或者如果没有其他价值的话,也只是下一个价值。从不完整的可观察值中获取最后的值

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

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

但最后都价值和last()等待takeLast(1)可观察完成 - 这里不是期望的行为。

这怎么解决?有没有特定的运营商?

+0

难道你们就不能使用其他重播观察的 - 使用相同的源 - 有一个重播的价值,而不是N个值?那是你正在寻找的行为,对吧? – cartant

回答

3

我有一个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(...) 
+0

谢谢。 combineLatest将是很好的解决方案,但我遇到了问题。它返回一个数组,它可以很容易地修复。但它也会造成不完整的可观察性,因此,妥协也不会奏效([见这里](http://plnkr.co/edit/MYXA77bKSodmCNiyAFik))。 – estus

+0

我的不好。添加了所需的代码 – Meir

+0

不幸的是,它看起来并不那么简单。 (1)'将从重放中获取第一个值('2'而不是'3',在这里http://plnkr.co/edit/MzrwhL1A2YEA0wApfKRy)。因此它在这方面与'possibleReplayedIncomplteObservable.take(1)'没有区别。 – estus

相关问题