BehaviorSubject es un tipo de asunto, un asunto es un tipo especial de observable para que pueda suscribirse a mensajes como cualquier otro observable. Las características únicas de BehaviorSubject son:
- Necesita un valor inicial, ya que siempre debe devolver un valor en la suscripción, incluso si no ha recibido un
next()
- Tras la suscripción, devuelve el último valor del tema. Un observable regular solo se dispara cuando recibe un
onnext
- en cualquier momento, puede recuperar el último valor del sujeto en un código no observable utilizando el
getValue()
método
Las características únicas de un sujeto en comparación con un observable son:
- Es un observador además de ser un observable, por lo que también puede enviar valores a un sujeto además de suscribirse a él.
Además, puede obtener un sujeto observable del comportamiento utilizando el asObservable()
método activado BehaviorSubject
.
Observable es un genérico, y BehaviorSubject
técnicamente es un subtipo de Observable porque BehaviorSubject es un observable con cualidades específicas.
Ejemplo con BehaviorSubject :
// Behavior Subject
// a is an initial value. if there is a subscription
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a");
bSubject.next("b");
bSubject.subscribe(value => {
console.log("Subscription got", value); // Subscription got b,
// ^ This would not happen
// for a generic observable
// or generic subject by default
});
bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d
Ejemplo 2 con sujeto regular:
// Regular Subject
let subject = new Subject();
subject.next("b");
subject.subscribe(value => {
console.log("Subscription got", value); // Subscription wont get
// anything at this point
});
subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d
Se puede crear un observable desde ambos Subject
y BehaviorSubject
usando subject.asObservable()
.
La única diferencia es que no puede enviar valores a un next()
método observable .
En los servicios angulares, lo usaría BehaviorSubject
para un servicio de datos, ya que un servicio angular a menudo se inicializa antes de que el componente y el sujeto de comportamiento garanticen que el componente que consume el servicio reciba los últimos datos actualizados incluso si no hay nuevas actualizaciones desde la suscripción del componente a estos datos.
Observable: resultado diferente para cada observador
Una diferencia muy muy importante. Como Observable es solo una función, no tiene ningún estado, por lo que para cada nuevo Observador, ejecuta el código de creación observable una y otra vez. Esto resulta en:
Esto causa errores importantes e ineficiencias.
BehaviorSubject (o Subject) almacena detalles del observador, ejecuta el código solo una vez y da el resultado a todos los observadores.
Ex:
JSBin: http://jsbin.com/qowulet/edit?js,console
Salida:
Observe cómo el uso de resultados
Observable.create
creados diferentes para cada observador, peroBehaviorSubject
dio el mismo resultado para todos los observadores. Esto es importante.Otras diferencias resumidas.
fuente
KnockoutJS's ko.observable()
verá inmediatamente más paralelos aRx.BehaviorSubject
comparación conRx.Observable
Observable y sujeto son ambos observables significa que un observador puede rastrearlos. pero ambos tienen algunas características únicas. Además, hay un total de 3 tipos de temas, cada uno de ellos nuevamente tiene características únicas. Tratemos de entender cada uno de ellos.
Puede encontrar el ejemplo práctico aquí en stackblitz . (Debe verificar la consola para ver la salida real)
Observables
Son fríos: el código se ejecuta cuando tienen al menos un solo observador.
Crea una copia de datos: Observable crea una copia de datos para cada observador.
Unidireccional: el observador no puede asignar valor a observable (origen / maestro).
Subject
Están calientes: el código se ejecuta y el valor se transmite incluso si no hay observador.
Datos compartidos: se comparten los mismos datos entre todos los observadores.
bidireccional: el observador puede asignar valor a observable (origen / maestro).
Si está utilizando el sujeto, pierde todos los valores que se transmiten antes de la creación del observador. Así que aquí viene el tema de reproducción
ReplaySubject
Están calientes: el código se ejecuta y el valor se transmite incluso si no hay observador.
Datos compartidos: se comparten los mismos datos entre todos los observadores.
bidireccional: el observador puede asignar valor a observable (origen / maestro). más
Reproduzca el flujo de mensajes: no importa cuándo se suscriba el asunto de reproducción, recibirá todos los mensajes emitidos.
En el asunto y el tema de reproducción no puede establecer el valor inicial en observable. Así que aquí viene el sujeto conductual
BehaviorSubject
Están calientes: el código se ejecuta y el valor se transmite incluso si no hay observador.
Datos compartidos: se comparten los mismos datos entre todos los observadores.
bidireccional: el observador puede asignar valor a observable (origen / maestro). más
Reproduzca el flujo de mensajes: no importa cuándo se suscriba el asunto de reproducción, recibirá todos los mensajes emitidos.
Puede establecer el valor inicial: puede inicializar el observable con el valor predeterminado.
fuente
ReplaySubject
tiene un historial y puede transmitir / emitir una secuencia de valores (antiguos). Solo cuando el búfer se establece en 1 se comporta de manera similar a aBehaviorSubject
.El objeto Observable representa una colección basada en inserción.
Las interfaces Observador y Observable proporcionan un mecanismo generalizado para la notificación basada en notificaciones, también conocido como el patrón de diseño del observador. El objeto Observable representa el objeto que envía notificaciones (el proveedor); el objeto Observador representa la clase que los recibe (el observador).
La clase Asunto hereda tanto Observable como Observador, en el sentido de que es a la vez observador y observable. Puede usar un tema para suscribir a todos los observadores y luego suscribir el tema a una fuente de datos de fondo
Más en https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md
fuente
Una cosa que no veo en los ejemplos es que cuando lanza BehaviorSubject to Observable a través de asObservable, hereda el comportamiento de devolver el último valor en la suscripción.
Es un poco complicado, ya que a menudo las bibliotecas exponen los campos como observables (es decir, parámetros en ActivatedRoute en Angular2), pero pueden usar Subject o BehaviorSubject detrás de escena. Lo que usan afectaría el comportamiento de la suscripción.
Ver aquí http://jsbin.com/ziquxapubo/edit?html,js,console
fuente
Un observable le permite suscribirse solo mientras que un sujeto permite publicar y suscribirse.
Por lo tanto, un tema permite que sus servicios se utilicen como editor y como suscriptor.
A partir de ahora, no soy tan bueno,
Observable
así que compartiré solo un ejemplo deSubject
.Comprendamos mejor con un ejemplo de CLI angular . Ejecute los siguientes comandos:
Reemplace el contenido de
app.component.html
con:Ejecute el comando
ng g c components/home
para generar el componente de inicio. Reemplace el contenido dehome.component.html
con:#message
es la variable local aquí. Agregue una propiedadmessage: string;
a laapp.component.ts
clase 's.Ejecute este comando
ng g s service/message
. Esto generará un servicio ensrc\app\service\message.service.ts
. Proporcionar este servicio a la aplicación. .Importar
Subject
aMessageService
. Agrega un tema también. El código final se verá así:Ahora, inyecte este servicio
home.component.ts
y pase una instancia del mismo al constructor. Haz esto porapp.component.ts
también. Use esta instancia de servicio para pasar el valor de#message
a la función de serviciosetMessage
:En el interior
app.component.ts
, suscríbase y anule la suscripción (para evitar pérdidas de memoria) aSubject
:Eso es.
Ahora, cualquier valor ingresado dentro
#message
dehome.component.html
se imprimirá{{message}}
dentroapp.component.html
fuente
app.component.ts
behaviour.service.ts
custom.component.ts
fuente
BehaviorSubject vs Observable : RxJS tiene observadores y observables, Rxjs ofrece múltiples clases para usar con flujos de datos, y uno de ellos es BehaviorSubject.
Observables : los observables son colecciones diferidas de múltiples valores a lo largo del tiempo.
BehaviorSubject : Un sujeto que requiere un valor inicial y emite su valor actual a los nuevos suscriptores.
fuente
Piense en los Observables como una tubería con agua corriente, a veces el agua fluye y otras no. En algunos casos, es posible que necesite una tubería que siempre tenga agua, puede hacer esto creando una tubería especial que siempre contenga agua, sin importar cuán pequeña sea, llamemos a esta tubería especial BehaviorSubject , si resulta ser un proveedor de suministro de agua en su comunidad, puede dormir tranquilo por la noche sabiendo que su tubería recién instalada simplemente funciona.
En términos técnicos: puede encontrar casos de uso en los que un Observable siempre debe tener valor, tal vez desee capturar el valor de un texto de entrada a lo largo del tiempo, luego puede crear una instancia de BehaviorSubject para garantizar este tipo de comportamiento, digamos:
Luego puede usar "valor" para muestrear los cambios a lo largo del tiempo.
Esto resulta útil cuando combina Observables más adelante, al observar el tipo de su transmisión como BehaviorSubject, puede asegurarse de que la transmisión al menos se dispare o señale al menos una vez .
fuente