Cómo obtener el valor "actual" de un Observador en el momento de suscribirse


Estoy teniendo dificultades para grokking una parte en particular de RxJS: cuando se suscribe a un Observable, solo se está suscribiendo a cualquier futuro eventos de esa secuencia. Compare con las Promesas, donde, si la promesa se ha resuelto, obtendrá ese valor sin importar cuando llame then().

Aquí hay un ejemplo de código:

var subject = new Rx.Subject();

subject.onNext('old value');
subject.onNext('before subscription');

subject.subscribe(function(val) {
  document.write(val);
});

subject.onNext('after subscription');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.3.24/rx.all.js"></script>

Esperaría ver tanto" antes de la suscripción "como" después de la suscripción " impreso, aunque tiene sentido para mí que el" valor antiguo " caería. Pero parece que RxJS no funciona de esa manera (solo se imprime "después de la suscripción"). ¿Cómo puedo obtener el resultado que busco?

Author: DallonF, 2015-02-04

1 answers

Rx ofrece ambos comportamientos (así como otros).

Los diferentes sujetos Rx disponibles pueden permitirle explorar las diferentes formas en que los observables pueden comportarse:

  • El Rx.Subject es la variedad más básica de disparar y olvidar if si no estaba suscrito cuando ocurrió el evento, entonces no lo ve.

  • Use new Rx.BehaviorSubject(undefined) en lugar de Subject y obtendrá el comportamiento que estaba buscando, ya que un BehaviorSubject representa un " valor que puede change "

  • Use new Rx.ReplaySubject(5) y obtendrá los 5 valores más recientes tan pronto como se suscriba

  • Use new Rx.AsyncSubject() y no obtendrá nada hasta que el observable complete en ese momento obtendrá el valor final (y continuará obteniendo el valor final si se suscribe nuevamente). Este es el verdadero análogo Rx de las Promesas, ya que no produce nada hasta que "resuelve" (es decir, completa), y después siempre da el valor a cualquiera que se suscriba.

 80
Author: Brandon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-22 16:02:12