我有一个热门的观察者(在这种情况下是一个主题):
var subject = new Rx.Subject();
我想创建另一个observable,每次创建新订阅时都会立即触发生成的最后一个值。
所以在伪代码中:
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;
});
};
答案 0 :(得分:18)
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>
答案 1 :(得分:6)
初始化
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>
答案 2 :(得分:0)
我在热.cache(1)
上使用了Observable
。似乎给出了你要求的行为(但我是新手)。
可观察到,每次新订阅时,都会立即触发生成的最后一个值。