Опубликуйте последнее значение наблюдаемой - PullRequest
21 голосов
/ 16 марта 2012

У меня есть горячая наблюдаемая (в данном случае тема):

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

Ответы [ 3 ]

18 голосов
/ 10 января 2014

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>
6 голосов
/ 16 марта 2012

BehaviorSubject

Инициализирует новый экземпляр класса 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>
0 голосов
/ 03 декабря 2016

Я использовал .cache(1) на горячем Observable.Кажется, дает поведение, о котором вы просили (но я новичок).

Заметно, что каждый раз при создании новых подписок немедленно запускается последнее произведенное значение.*

...