私はホットオブザーバブル(この場合は主題)を持っています:
var subject = new Rx.Subject();
新しいサブスクリプションが作成されるたびに、最後に生成された値がすぐに発生するという別のオブザーバブルを作成したいと思います。
したがって、擬似コードでは:
var myObservableWithLastValue = subject.publishLast();
subject.onNext(3);
myObservableWithLastValue.subscribe(function(x){
console.log(x); //should write 3
});
myObservableWithLastValue.subscribe(function(x){
console.log(x); //should write 3, too
});
subject.onNext(4);
myObservableWithLastValue.subscribe(function(x){
console.log(x); //should write 4
});
これは大まかに私が望むものであり、うまくいくようです。ただし、同じことを実現するには、いくつかの組み込みメカニズムが必要だと思います
Rx.Observable.prototype.keepLatest = function () {
var latestValue;
var disposable = this.subscribe(function (value) {
latestValue = value;
});
return Rx.Observable.create(function (observer) {
observer.onNext(latestValue);
return disposable.dispose;
});
};
RxJsに ReplaySubject
が追加されました。 1つのバッファーで初期化すると、BehaviorSubjectが作成されます。
// as an example, use buffer size of 2
var subject = new Rx.ReplaySubject(2 /* buffer size */);
subject.onNext('a');
subject.onNext('b');
subject.onNext('c');
subject.subscribe(function (x) { document.write('x1:' + x + '<br>'); });
subject.onNext('d');
subject.subscribe(function (x) { document.write('x2:' + x + '<br>'); });
<script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'></script>
Rx.BehaviorSubject
クラスの新しいインスタンスを初期化します。これにより、最後の値をキャッシュし、指定された値で始まるサブジェクトが作成されます。
var subject = new Rx.BehaviorSubject('a' /* initial value */);
subject.subscribe(function (x) {
console.log('x1:' + x);
});
subject.onNext('d');
// Will produce the last value.
subject.subscribe(function (x) {
console.log('x2:' + x);
});
<script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'></script>
ホットなObservable
で.cache(1)
を使用しました。あなたが求めた行動を与えるようです(しかし私は初心者です)。
新しいサブスクリプションが作成されるたびに、最後に生成された値がすぐに発生することがわかります。