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


250

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

Respuestas:


311

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

Ejemplo de tema (con RxJS 5 API):

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 consola: 1

Adicionalmente:

  • BehaviorSubject se puede crear con valor inicial: nuevo Rx.BehaviorSubject(1)
  • Considere ReplaySubjectsi desea que el sujeto tenga más de un valor

16
Entonces, ¿quiere decir que tiene que suscribirse al asunto antes que subject.next () a para que esto funcione?
Eric Huang

55
@eric para el sujeto, sí. Esa es la distinción.
onefootswill

99
Tenga en cuenta que debe pasar el primer valor al constructor de BehaviorSubject;)
mrmashal

si creamos sujeto con boolean incluso sujeto emite rito ?? const subject = nuevo Asunto <booleano> (); subject.next (verdadero);
user2900572

Si ayuda: Sujetos = Evento - BehaviorSubject = Estado;
Jonathan Stellwag

251

Comportamiento Sujeto

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

Tema

El asunto no devuelve el valor actual de la Suscripción. Se activa solo en la .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

12
También es más correcto: "BehaviourSubject devolverá el valor inicial o el valor actual en la Suscripción" es una mejor explicación que "Un BehaviorSubject tiene un valor".
Davy

1
Puse el código anterior en Stackblitz: stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond

¿Dónde está el observador B: 3?
OPV

@OPV ObserverB: 3 está ahí mientras llamassubject.next(3);
Mohammed Safeer


6

Podría ayudarte a entender.

import * as Rx from 'rxjs';

const subject1 = new Rx.Subject();
subject1.next(1);
subject1.subscribe(x => console.log(x)); // will print nothing -> because we subscribed after the emission and it does not hold the value.

const subject2 = new Rx.Subject();
subject2.subscribe(x => console.log(x)); // print 1 -> because the emission happend after the subscription.
subject2.next(1);

const behavSubject1 = new Rx.BehaviorSubject(1);
behavSubject1.next(2);
behavSubject1.subscribe(x => console.log(x)); // print 2 -> because it holds the value.

const behavSubject2 = new Rx.BehaviorSubject(1);
behavSubject2.subscribe(x => console.log('val:', x)); // print 1 -> default value
behavSubject2.next(2) // just because of next emission will print 2 

4

BehaviorSubjectconserva en la memoria el último valor emitido por el observable. Un regular Subjectno lo hace.

BehaviorSubjectes como ReplaySubjectcon un tamaño de búfer de 1.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.