web-dev-qa-db-ja.com

サブスクライブ時にオブザーバーの「現在の」値を取得する方法

RxJの特定の部分を理解するのに苦労しています。Observableをサブスクライブすると、そのStreamのfutureイベントのみをサブスクライブします。 Promisesと比較してください。Promisesでは、promiseが解決されている場合、then()を呼び出したときに関係なくその値が取得されます。

コード例を次に示します。

var subject = new Rx.Subject();

subject.onNext('old value');
subject.onNext('before subscription');

subject.subscribe(function(val) {
  document.write(val);
});

subject.onNext('after subscription');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.3.24/rx.all.js"></script>

「サブスクリプション前」と「サブスクリプション後」の両方が表示されると予想されますが、「古い値」がドロップされるのは理にかなっています。しかし、RxJsはそのようには機能しないようです(「サブスクリプション後」のみが出力されます)。私が望んでいる結果を得るにはどうすればよいですか?

48
DallonF

Rxは両方の動作(および他の動作)を提供します。

異なるRxサブジェクト を使用すると、オブザーバブルが動作するさまざまな方法を調べることができます。

  • _Rx.Subject_は最も基本的な発火忘れの種類です。イベントの発生時にサブスクライブしていなかった場合、表示されません。

  • Subjectの代わりにnew Rx.BehaviorSubject(undefined)を使用すると、BehaviorSubjectは「変化する可能性のある値」を表すため、探していた動作が得られます。

  • new Rx.ReplaySubject(5)を使用すると、購読するとすぐに最新の5つの値が取得されます。

  • new Rx.AsyncSubject()を使用すると、オブザーバブルcompletesが完了するまで何も得られず、その時点で最終値が得られます(そして、再度サブスクライブする場合の最終値)。これはPromisesの真のRxアナログです。なぜなら、「解決」する(つまり完了する)まで何も生成せず、その後はサブスクライブする人に常に値を与えるからです。

82
Brandon