Was ist der Unterschied zwischen Subjekt und BehaviorSubject?

250

Der Unterschied zwischen a Subjectund a ist mir nicht klar BehaviorSubject. Ist es nur so, dass a BehaviorSubjectdie getValue()Funktion hat?

Mike Jerred
quelle

Antworten:

311

Ein BehaviorSubject enthält einen Wert. Wenn es abonniert ist, gibt es den Wert sofort aus. Ein Betreff enthält keinen Wert.

Betreff Beispiel (mit RxJS 5 API):

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

Die Konsolenausgabe ist leer

Beispiel für ein BehaviorSubject:

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

Konsolenausgabe: 1

Zusätzlich:

  • BehaviorSubject kann mit dem Anfangswert erstellt werden: neu Rx.BehaviorSubject(1)
  • Überlegen ReplaySubjectSie, ob das Motiv mehr als einen Wert enthalten soll
ZahiC
quelle
16
Meinen Sie damit, dass Sie das Thema vor subject.next () abonnieren müssen, damit dies funktioniert?
Eric Huang
5
@eric für Betreff, ja. Das ist der Unterschied.
onefootswill
9
Beachten Sie, dass Sie den ersten Wert an den Konstruktor von BehaviorSubject übergeben müssen;)
mrmashal
Wenn wir ein Subjekt mit einem Booleschen Wert erstellen, gibt sogar ein Subjekt einen Ritus aus? const subject = new Subject <boolean> (); subject.next (true);
user2900572
Wenn es hilft: Subjects = Event - BehaviorSubject = State;
Jonathan Stellwag
251

BehaviourSubject

BehaviourSubject gibt den Anfangswert oder den aktuellen Wert im Abonnement zurück

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

Mit Ausgabe:

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

Gegenstand

Der Betreff gibt den aktuellen Wert des Abonnements nicht zurück. Es wird nur bei .next(value)Anruf und Rückgabe / Ausgabe der ausgelöstvalue

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

Mit folgender Ausgabe auf der Konsole:

observerA: 2
observerB: 2
observerA: 3
observerB: 3
Mohammed Safeer
quelle
12
Es ist auch korrekter: "BehaviourSubject gibt den Anfangswert oder den aktuellen Wert im Abonnement zurück" ist eine bessere Erklärung als "Ein BehaviorSubject enthält einen Wert".
Davy
1
Ich habe den obigen Code auf Stackblitz gesetzt: stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond
Wo ist Beobachter B: 3?
OPV
@OPV ObserverB: 3 ist da, während Sie anrufensubject.next(3);
Mohammed Safeer
6

Es könnte Ihnen helfen, zu verstehen.

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 
Sanjeet Kumar
quelle
4

BehaviorSubjectspeichert den letzten Wert, der vom Observable ausgegeben wurde. Ein Stammgast Subjectnicht.

BehaviorSubjectist wie ReplaySubjectbei einer Puffergröße von 1.

Moshe Chernysh
quelle