rxjs - días - Publicar el último valor de un observable.
rxjs observable (3)
Tengo un observable caliente (un tema en este caso):
var subject = new Rx.Subject();
Quiero crear otro observable que cada vez que se realizan nuevas suscripciones, se dispara de inmediato el último valor que se produjo.
Así que en el pseudo código:
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
});
Esto es más o menos lo que quiero y parece funcionar. Sin embargo, supongo que debe haber algún mecanismo incorporado para lograr el mismo
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;
});
};
He utilizado .cache(1)
en un Observable
caliente. Parece dar el comportamiento que pediste (pero soy un novato).
Es posible observar que cada vez que se realizan nuevas suscripciones, se dispara inmediatamente el último valor producido.
RxJs ahora tiene el ReplaySubject
. Inicialízalo con 1 búfer y tienes el 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>
Inicializa una nueva instancia de la clase
Rx.BehaviorSubject
que crea un sujeto que almacena en caché su último valor y comienza con el valor especificado.
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>