2016-10-26 118 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

相關問題