Quelle est la différence entre Subject et BehaviorSubject?


250

Je ne suis pas clair sur la différence entre a Subjectet a BehaviorSubject. Est-ce juste que a BehaviorSubjecta la getValue()fonction?

Réponses:


311

Un BehaviorSubject contient une valeur. Lorsqu'il est souscrit, il émet la valeur immédiatement. Un sujet n'a pas de valeur.

Exemple de sujet (avec l'API RxJS 5):

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

La sortie de la console sera vide

Exemple BehaviorSubject:

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

Sortie console: 1

En outre:

  • BehaviorSubject peut être créé avec la valeur initiale: nouveau Rx.BehaviorSubject(1)
  • Considérez ReplaySubjectsi vous voulez que le sujet contienne plus d'une valeur

16
Donc, voulez-vous dire que vous devez vous abonner à subject avant subject.next () pour que cela fonctionne?
Eric Huang

5
@eric pour Subject, oui. Telle est la distinction.
onefootswill

9
Notez que vous devez passer la première valeur au constructeur de BehaviorSubject;)
mrmashal

si on crée un sujet booléen même le sujet émet du rite ?? const subject = new Subject <boolean> (); subject.next (true);
user2900572

Si cela aide: Subjects = Event - BehaviorSubject = State;
Jonathan Stellwag

251

BehaviourSubject

BehaviourSubject renverra la valeur initiale ou la valeur actuelle lors de l'abonnement

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);

Avec sortie:

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

Matière

Le sujet ne renvoie pas la valeur actuelle lors de l'abonnement. Il ne déclenche que sur .next(value)appel et retourne / sort levalue

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);

Avec la sortie suivante sur la console:

observerA: 2
observerB: 2
observerA: 3
observerB: 3

12
C'est aussi plus correct: "BehaviourSubject renverra la valeur initiale ou la valeur actuelle sur l'abonnement" est une meilleure explication que "Un BehaviourSubject contient une valeur."
Davy

1
J'ai mis le code ci-dessus sur Stackblitz: stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond

Où est observateurB: 3?
OPV

@OPV ObserverB: 3 est là pendant que vous appelezsubject.next(3);
Mohammed Safeer


6

Cela pourrait vous aider à comprendre.

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

BehaviorSubjectgarde en mémoire la dernière valeur émise par l'observable. Un habituéSubject ne le fait pas.

BehaviorSubjectest comme ReplaySubjectavec une taille de tampon de 1.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.