¿Cuál es la diferencia entre Subject y BehaviorSubject?

No tengo clara la diferencia entre un Subject y un BehaviorSubject. ¿Es sólo que un BehaviorSubject tiene la función getValue?

Solución

Un BehaviorSubject contiene un valor. Cuando se suscribe, emite el valor inmediatamente. Un Subject no contiene ningún valor.

Ejemplo de Subject (con la 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 BehaviorSubject:

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

Salida de la consola: 1

Además:

  • BehaviorSubject se puede crear con valor inicial: new Rx.BehaviorSubject(1)
  • Considere ReplaySubject si desea que el sujeto contenga más de un valor
Comentarios (3)

ComportamientoAsunto

BehaviourSubject devolverá el valor inicial o el valor actual en Subscription

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

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

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

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

subject.next(3);

Con salida:

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

Asunto

Subject no devuelve el valor actual en la suscripción. Sólo se activa cuando se llama a .next(value) y devuelve el value.

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 la siguiente salida en la consola:

observerA: 2
observerB: 2
observerA: 3
observerB: 3
Comentarios (6)

Acabo de crear un proyecto que explica cuál es la diferencia entre todos los temas:
https://github.com/piecioshka/rxjs-subject-vs-behavior-vs-replay-vs-async

Comentarios (0)