22

我有一个热门的 observable(在这种情况下是一个主题):

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;
    });
};
4

3 回答 3

20

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>

于 2014-01-10T12:21:40.270 回答
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>

于 2012-03-16T14:42:24.690 回答
0

我用.cache(1)过热的Observable。似乎给出了您要求的行为(但我是新手)。

可以观察到,每次进行新订阅时,都会立即触发产生的最后一个值。

于 2016-12-03T08:52:49.347 回答