2016-10-26 4 views
2

n値の再生を持つことができる、または持たない不完全な観測値があります。私はそれから最後の価値を得ることを望んでいます - もしまだ存在しなければ、次の価値を得てください。不完全な観測値からの最後の値を取得

これはfirst()take(1)example)で最初に使用可能な値のために働く:

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

しかし、最後の値のために観察完了のための両方last()takeLast(1)待機 - ここにいないのが望ましい行動を。

どうすれば解決できますか?そのための特定の演算子はありますか?

+0

あなたは別のものを使用することはできませんが、観察リプレイ - むしろN値よりも、単一のリプレイ値を持っている - 同じソースを使用していますか?それはあなたが探している行動ですよね? – cartant

答えて

3

私は最新の要素を得るためにシーケンスを '排除する'というソリューションを持っていました。そして、そのシーケンスが空であれば、最後の要素を取りますが、扱いにくく、リプレイサイズを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は良い解決策になりますが、私はそれに問題があります。それは配列を返し、簡単に修正することができます。しかし、それは不完全な観察も可能にしますが、toPromiseはうまくいきません([ここを参照](http://plnkr.co/edit/MYXA77bKSodmCNiyAFik))。 – estus

+0

私の悪いです。必要なコードを追加しました – Meir

+0

悲しいことに、そう簡単ではないようです。 'take(1)'はリプレイからの最初の値をとります(ここでは 'three'の代わりに 'two'、http://plnkr.co/edit/MzrwhL1A2YEA0wApfKRy)。したがって、この点に関して 'possibleReplayedIncomplteObservable.take(1)'との違いはありません。 – estus

関連する問題