2017-09-27 11 views
0

以下は、私が何をしようとしているかを説明するスニペットです。私のアプリケーションでは、全体を通して使用されているreplaysubjectがあります。特定の時点で、私は最後にsubjectから放出された値を取得したいが、lastはReplaySubjectでは機能しないようだ。ReplaySubjectから最後の値を取得するにはどうすればよいですか?

const subject = new Rx.ReplaySubject(); 

subject.next(1); 
subject.next(2); 
subject.next(3); 
subject.next(4); 

subject.subscribe(num => console.log(num)); 

var lastObserver = subject.last(); 
lastObserver.subscribe(num => console.log('last: ' + num)); 

FIDDLE

上記のコードはlastObserverのために何かを発射するが、うまく作品を加入していません。

答えて

1

あなたの混乱は、.last()オペレータがどのように働くことになっているのでしょうか?

.last()は、ストリームが完了するのを待ってから、ストリームが終了する前に放出された最後の値を返します。そのためにはストリームを終了する必要があります。

あなたのlastObserverは、被験者が完了するとすぐに放出されると思います。

const subject = new Rx.ReplaySubject(); 

subject.next(1); 
subject.next(2); 
subject.next(3); 
subject.next(4); 

subject.subscribe(num => console.log(num)); 
subject.complete(); // end your stream here 
var lastObserver = subject.last(); 
lastObserver.subscribe(num => console.log('last: ' + num)); 

あなたが最後にあなたのストリームをしたくないが、あなたは、加入者が加入する前に放出された最後の値を受信したくない場合は、このユースケースのために設計された、BehaviorSubjectのために達することを検討してください。

+0

これで完了した場合、他のユーザはアップデートを取得できません。 – Smeegs

+0

そうです。新規加入者が購読するとすぐに最後の発射を受信する必要がある場合は、 'ReplaySubject' +' last'を捨て、代わりに 'BehaviorSubject'を使用してください。 – xtianjohns

+0

私は間違った被写体を使用していると確信していますが、これが正しいかどうかはわかりません。私はその状況を説明しましょう。これは、api呼び出しの結果を送信するサブジェクトです。ほとんどの場合、加入者は最後のものではなく次の発信を望む。しかし、私は最後の放出が何であったかを見たい1つの状況があります。 – Smeegs

関連する問題