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はそのようには機能しないようです(「サブスクリプション後」のみが出力されます)。私が望んでいる結果を得るにはどうすればよいですか?
Rxは両方の動作(および他の動作)を提供します。
異なるRxサブジェクト を使用すると、オブザーバブルが動作するさまざまな方法を調べることができます。
_Rx.Subject
_は最も基本的な発火忘れの種類です。イベントの発生時にサブスクライブしていなかった場合、表示されません。
Subject
の代わりにnew Rx.BehaviorSubject(undefined)
を使用すると、BehaviorSubject
は「変化する可能性のある値」を表すため、探していた動作が得られます。
new Rx.ReplaySubject(5)
を使用すると、購読するとすぐに最新の5つの値が取得されます。
new Rx.AsyncSubject()
を使用すると、オブザーバブルcompletesが完了するまで何も得られず、その時点で最終値が得られます(そして、再度サブスクライブする場合の最終値)。これはPromisesの真のRxアナログです。なぜなら、「解決」する(つまり完了する)まで何も生成せず、その後はサブスクライブする人に常に値を与えるからです。