He estado buscando entender esos 3:
Asunto , Asunto de comportamiento y Asunto de repetición . Me gustaría usarlos y saber cuándo y por qué, cuáles son los beneficios de usarlos y, aunque he leído la documentación, he visto tutoriales y he buscado en Google, no he podido entender esto.
Entonces, ¿cuál es su propósito? Un caso del mundo real sería muy apreciado porque ni siquiera tiene que codificar.
Preferiría una explicación clara, no solo "a + b => c al que estás suscrito ...."
Gracias
javascript
angular
rxjs
reactive-programming
angular2-observables
Paul Samsotha
fuente
fuente
Respuestas:
Realmente se reduce al comportamiento y la semántica. Con un
Subject
- un suscriptor solo obtendrá valores publicados que se emitieron después de la suscripción. Pregúntese, ¿es eso lo que quiere? ¿El suscriptor necesita saber algo sobre valores anteriores? De lo contrario, puede usar esto, de lo contrario, elija uno de los otros. Por ejemplo, con comunicación de componente a componente. Supongamos que tiene un componente que publica eventos para otros componentes con un clic de botón. Puede utilizar un servicio con un tema para comunicarse.BehaviorSubject
- el último valor se almacena en caché. Un suscriptor obtendrá el valor más reciente con la suscripción inicial. La semántica de este tema es representar un valor que cambia con el tiempo. Por ejemplo, un usuario que inició sesión. El usuario inicial puede ser un usuario anónimo. Pero una vez que un usuario inicia sesión, el nuevo valor es el estado del usuario autenticado.El
BehaviorSubject
se inicializa con un valor inicial. A veces, esto es importante para la preferencia de codificación. Digamos, por ejemplo, que lo inicializa con unnull
. Luego, en su suscripción, debe hacer una verificación nula. Quizás está bien, o quizás molesto.ReplaySubject
- Puede almacenar en caché hasta un número específico de emisiones. Los suscriptores obtendrán todos los valores almacenados en caché al suscribirse. ¿Cuándo necesitarías este comportamiento? Honestamente, no he tenido ninguna necesidad de tal comportamiento, excepto en el siguiente caso:Si inicializa a
ReplaySubject
con un tamaño de búfer de1
, entonces en realidad se comporta como aBehaviorSubject
. El último valor siempre se almacena en caché, por lo que actúa como un valor que cambia con el tiempo. Con esto, no hay necesidad de unanull
verificación como en el caso de losBehaviorSubject
inicializados con unnull
. En este caso, nunca se emite ningún valor al suscriptor hasta la primera publicación.Así que todo se reduce al comportamiento que esperas (en cuanto a cuál usar). La mayor parte del tiempo probablemente querrá utilizar un
BehaviorSubject
porque lo que realmente quiere representar es esa semántica de "valor en el tiempo". Pero personalmente no veo nada malo en la sustitución deReplaySubject
inicializado con1
.Lo que desea evitar es usar la vainilla
Subject
cuando lo que realmente necesita es un comportamiento de almacenamiento en caché. Tomemos, por ejemplo, que está escribiendo un guardia de ruta o una resolución. Obtienes algunos datos en esa protección y los configuras en un servicioSubject
. Luego en el componente enrutado te suscribes al servicio sujeto para intentar sacar ese valor que se emitió en la guardia. OOP. ¿Dónde está el valor? Ya fue emitido, DUH. Utilice un tema de "almacenamiento en caché".Ver también:
fuente
ReplaySubject
con un tamaño de búfer de 1 era exactamente lo que necesitaba. Tenía un guardia de ruta que necesitaba el valor, pero necesitaba esperar la primera emisión. Entonces,BehaviorSubject
no lo estaba cortando, ya que no quería un valor inicial (null
tampoco funcionaría porque lo estaba usando para significar un estado)resolve
clase de guardia angular . Mi servicio de datos podría ser asíncrono o síncrono (si los datos ya se habían recuperado). Si era sincrónico, el Subject.next () se activaba antes de que laresolve
función hubiera regresado y Angular se suscribiera internamente. BehaviourSubject posiblemente funcionaría, pero tendría que llamar explícitamentecomplete()
y también agregarnull
cheques para el valor inicial. Lo que funcionó fue nuevoReplaySubject<DataType>(1)
yresolveSubject.asObservable().take(1).map(....)
.asObservable()
el Observable, envío un valor denull
a los suscriptores antes de llamarnext()
a mi ReplaySubject. Pensé que no se suponía que tuviera un valor inicial a diferencia de BehaviorSubject.Un resumen útil de los diferentes tipos observables, nombres no intuitivos que sé jajaja .
Subject
- Un suscriptor solo obtendrá los valores publicados después de que se haya realizado la suscripción.BehaviorSubject
- Los nuevos suscriptores obtienen el último valor publicado O el valor inicial inmediatamente después de la suscripción.ReplaySubject
- Los nuevos suscriptores obtienen todos los valores publicados anteriormente inmediatamente después de la suscripciónfuente
Con este ejemplo, aquí está el resultado que se imprimirá en la consola:
A continuación, se muestra un ejemplo de uso para reproducir sujetos en los que
buffer of 2 previous values
se mantienen y se emiten en nuevas suscripciones:Esto es lo que nos brinda en la consola:
Y el resultado:
Referencia: https://alligator.io/rxjs/subjects/
fuente
De: libro de Randall Koutnik "Construya sitios web reactivos con RxJS". :
Un sujeto es un objeto que es un observable turboalimentado. En esencia, un Sujeto actúa como un observable regular, pero cada suscripción está conectada a la misma fuente. Los sujetos también son observadores y tienen métodos de siguiente, error y hecho para enviar datos a todos los suscriptores a la vez. Porque los sujetos son observadores, se pueden pasar directamente a una llamada de suscripción y todos los eventos del observable original se enviarán a través del sujeto a sus suscriptores.
Podemos usar ReplaySubject para rastrear el historial. UNA ReplaySubject registra los últimos n eventos y los devuelve a cada nuevo suscriptor. Por ejemplo, en la aplicación de chat. Podemos usarlo para rastrear el registro del historial de chat anterior.
Un BehaviorSubject es una versión simplificada de ReplaySubject . El ReplaySubject almacenó un número arbitrario de eventos, el BehaviorSubject solo registra el valor del último evento. Siempre que un BehaviorSubject registra una nueva suscripción, emite el último valor al suscriptor, así como los nuevos valores que se le pasan. BehaviorSubject es útil cuando se trata de unidades de estado individuales, como opciones de configuración.
fuente
La respuesta más votada es claramente incorrecta al afirmar que:
"Si inicializa a
ReplaySubject
con un tamaño de búfer de 1, en realidad se comporta como unBehaviorSubject
"Esto no es del todo cierto; Consulte esta excelente publicación de blog sobre las diferencias entre esos dos. Por ejemplo, si se suscribe a un completo
BehaviorSubject
, no recibirá el último valor, pero por unReplaySubject(1)
, recibirá el último valor.Esta es una diferencia importante que no debe pasarse por alto:
Consulte este ejemplo de código aquí que proviene de otra excelente publicación de blog sobre el tema.
fuente
fuente