¿Cuál es la diferencia entre Sujeto y Sujeto de Comportamiento?

Resuelto Mike Jerred asked hace 7 años • 10 respuestas

No tengo clara la diferencia entre a Subjecty a BehaviorSubject. ¿Es solo que a BehaviorSubjecttiene la getValue()función?

Mike Jerred avatar Apr 11 '17 21:04 Mike Jerred
Aceptado

Un BehaviorSubject tiene un valor. Cuando se suscribe emite el valor inmediatamente. Un Asunto no tiene un valor.

Ejemplo de tema (con API RxJS 5):

const subject = new Rx.Subject();
subject.next(1);
subject.subscribe(x => console.log(x));

La salida de la consola estará vacía

Ejemplo de sujeto de comportamiento:

const subject = new Rx.BehaviorSubject(0);
subject.next(1);
subject.subscribe(x => console.log(x));

Salida de consola: 1

Además:

  • BehaviorSubjectdebe crearse con un valor inicial: nuevoRx.BehaviorSubject(1)
  • Considere ReplaySubjectsi desea que el tema obtenga valores publicados anteriormente.
ZahiC avatar Apr 11 '2017 16:04 ZahiC

ComportamientoAsunto

BehaviourSubject devolverá el valor inicial o el valor actual en la Suscripción

var bSubject= new Rx.BehaviorSubject(0);  // 0 is the initial value

bSubject.subscribe({
  next: (v) => console.log('observerA: ' + v)  // output initial value, then new values on `next` triggers
});

bSubject.next(1);  // output new value 1 for 'observer A'
bSubject.next(2);  // output new value 2 for 'observer A', current value 2 for 'Observer B' on subscription

bSubject.subscribe({
  next: (v) => console.log('observerB: ' + v)  // output current value 2, then new values on `next` triggers
});

bSubject.next(3);

Con salida:

observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3

Sujeto

El sujeto no devuelve el valor actual de la Suscripción. Se activa solo en caso de .next(value)llamada y devuelve/emite elvalue

var subject = new Rx.Subject();

subject.next(1); //Subjects will not output this value

subject.subscribe({
  next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
  next: (v) => console.log('observerB: ' + v)
});

subject.next(2);
subject.next(3);

Con el siguiente resultado en la consola:

observerA: 2
observerB: 2
observerA: 3
observerB: 3
Mohammed Safeer avatar Oct 21 '2017 00:10 Mohammed Safeer