Matías, parte de este gran equipo de trabajo, nos ha hecho el favor de crear este tutorial porque domina a la perfección dicho tema.
Solución:
A Subject
o Observable
no tiene un valor actual. Cuando se emite un valor, se pasa a los suscriptores y el Observable
se hace con eso.
Si desea tener un valor actual, utilice BehaviorSubject
que está diseñado exactamente para ese propósito. BehaviorSubject
mantiene el último valor emitido y lo emite inmediatamente a los nuevos suscriptores.
También tiene un método getValue()
para obtener el valor actual.
La única forma en que tú deberían obtener valores “fuera de” un Observable/Sujeto es con ¡suscríbete!
si estás usando getValue()
estás haciendo algo imperativo en el paradigma declarativo. Está ahí como una escotilla de escape, pero 99.9% del tiempo que NO debe usar getValue()
. Hay algunas cosas interesantes que getValue()
lo hará: arrojará un error si el sujeto ha sido cancelado, evitará que obtenga un valor si el sujeto está muerto porque tiene un error, etc. Pero, nuevamente, está ahí como una vía de escape para circunstancias excepcionales.
Hay varias formas de obtener el valor más reciente de un Sujeto u Observable de forma “Rx-y”:
- Utilizando
BehaviorSubject
: Pero en realidad suscribiéndote a él. Cuando te suscribes por primera vez aBehaviorSubject
enviará sincrónicamente el valor anterior que recibió o con el que se inicializó. - Usando un
ReplaySubject(N)
: Esto almacenará en cachéN
valores y reprodúzcalos a los nuevos suscriptores. A.withLatestFrom(B)
: use este operador para obtener el valor más reciente de observableB
cuando es observableA
emite. Le dará ambos valores en un array[a, b]
.A.combineLatest(B)
: Utilice este operador para obtener los valores más recientes deA
yB
cada vez que seaA
oB
emite. Le dará ambos valores en un array.shareReplay()
: Realiza una multidifusión Observable a través de unReplaySubject
, pero le permite volver a intentar el observable en caso de error. (Básicamente, te da ese comportamiento de almacenamiento en caché prometedor).publishReplay()
,publishBehavior(initialValue)
,multicast(subject: BehaviorSubject | ReplaySubject)
etc: Otros operadores que apalancanBehaviorSubject
yReplaySubject
. Diferentes sabores de lo mismo, básicamente transmiten la fuente observable al canalizar todas las notificaciones a través de un asunto. tienes que llamarconnect()
para suscribirse a la fuente con el tema.
Tuve una situación similar en la que los suscriptores tardíos se suscribieron al Asunto después de que llegó su valor.
Encontré que ReplaySubject, que es similar a BehaviorSubject, funciona de maravilla en este caso. Y aquí hay un enlace para una mejor explicación: http://reactivex.io/rxjs/manual/overview.html#replaysubject
Si te gustó nuestro trabajo, puedes dejar un escrito acerca de qué te ha gustado de este enunciado.