Solución:
Realmente se reduce al comportamiento y la semántica. Con un
-
Subject
– un suscriptor solo obtendrá valores publicados que fueron emitidos después la suscripción. Pregúntese, ¿es eso lo que quiere? ¿El suscriptor necesita saber algo sobre valores anteriores? Si no es así, puede usar esto; de lo contrario, elija uno de los otros. Por ejemplo, con la comunicación de componente a componente. Supongamos que tiene un componente que publica eventos para otros componentes al hacer clic en un 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.los
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 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 un
ReplaySubject
con un tamaño de búfer de1
, entonces en realidad se comporta como unBehaviorSubject
. El último valor siempre se almacena en caché, por lo que actúa como un valor que cambia con el tiempo. Con esto, no es necesario unnull
comprobar como en el caso delBehaviorSubject
inicializado con unnull
. En este caso, nunca se emite ningún valor al suscriptor hasta la primera publicación.
Entonces, realmente 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 quieres representar es esa semántica de “valor en el tiempo”. Pero personalmente no veo nada malo en la sustitución de ReplaySubject
inicializado con 1
.
Qué quieres hacer evitar está usando 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 servicio Subject
. Luego en el componente enrutado te suscribes al servicio sujeto para intentar sacar ese valor que se emitió en la guardia. UPS. ¿Dónde está el valor? Ya fue emitido, DUH. ¡Utilice un tema de “almacenamiento en caché”!
Ver también:
- ¿Cuáles son los sujetos RxJS y los beneficios de usarlos?
Un resumen útil de los diferentes tipos observables, nombres no intuitivos lo 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ón
- Tema: Al suscribirse, siempre obtiene los datos que se envían después de su suscripción, es decir. los valores empujados anteriormente no se reciben.
const mySubject = new Rx.Subject();
mySubject.next(1);
const subscription1 = mySubject.subscribe(x => {
console.log('From subscription 1:', x);
});
mySubject.next(2);
const subscription2 = mySubject.subscribe(x => {
console.log('From subscription 2:', x);
});
mySubject.next(3);
subscription1.unsubscribe();
mySubject.next(4);
Con este ejemplo, aquí está el resultado que se imprimirá en la consola:
From subscription 1: 2
From subscription 1: 3
From subscription 2: 3
From subscription 2: 4
Tenga en cuenta cómo las suscripciones que llegan tarde se pierden algunos de los datos que se han introducido en el tema.
- Repetir temas: puede ayudar manteniendo un búfer de valores anteriores que se emitirán a las nuevas suscripciones.
A continuación, se muestra un ejemplo de uso de temas de repetición donde un buffer of 2 previous values
se mantienen y emiten en nuevas suscripciones:
const mySubject = new Rx.ReplaySubject(2);
mySubject.next(1);
mySubject.next(2);
mySubject.next(3);
mySubject.next(4);
mySubject.subscribe(x => {
console.log('From 1st sub:', x);
});
mySubject.next(5);
mySubject.subscribe(x => {
console.log('From 2nd sub:', x);
});
Esto es lo que nos brinda en la consola:
From 1st sub: 3
From 1st sub: 4
From 1st sub: 5
From 2nd sub: 4
From 2nd sub: 5
- Sujetos de comportamiento: son similares a los sujetos de reproducción, pero volverán a emitir solo el último valor emitido, o un valor predeterminado si no se ha emitido ningún valor previamente:
const mySubject = new Rx.BehaviorSubject('Hey now!');
mySubject.subscribe(x => {
console.log('From 1st sub:', x);
});
mySubject.next(5);
mySubject.subscribe(x => {
console.log('From 2nd sub:', x);
});
Y el resultado:
From 1st sub: Hey now!
From 1st sub: 5
From 2nd sub: 5
Referencia: https://alligator.io/rxjs/subjects/