Subject और BehaviorSubject में क्या अंतर है?


250

मैं a Subjectऔर a के बीच के अंतर पर स्पष्ट नहीं हूं BehaviorSubject। यह है सिर्फ इतना है कि एक BehaviorSubjectहै getValue()समारोह?

जवाबों:


311

एक BehaviorSubject एक मूल्य रखता है। जब इसे सब्सक्राइब किया जाता है तो यह तुरंत मूल्य का उत्सर्जन करता है। एक विषय एक मूल्य नहीं रखता है।

विषय उदाहरण (RxJS 5 API के साथ):

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

कंसोल आउटपुट खाली होगा

व्यवहार-विषय का उदाहरण:

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

कंसोल आउटपुट: 1

के अतिरिक्त:

  • BehaviorSubject प्रारंभिक मूल्य के साथ बनाया जा सकता है: नया Rx.BehaviorSubject(1)
  • विचार करें ReplaySubjectकि क्या आप विषय को एक से अधिक मान रखना चाहते हैं

16
तो क्या इसका मतलब यह है कि आपको इस विषय पर काम करने के लिए सब्जेक्ट से पहले सब्मिट करना होगा ।next ()?
एरिक हुआंग

5
@ विषय विषय के लिए, हाँ। वह भेद है।
वनफुटस्विल

9
ध्यान दें कि आपको BehaviorSubject के कंस्ट्रक्टर के पहले मूल्य में पास होना है;)
mrmashal

अगर हम बूलियन के साथ विषय बनाते हैं तो भी विषय संस्कार का उत्सर्जन करता है ?? const विषय = नया विषय <boolean> (); subject.next (सही);
user2900572

यदि यह मदद करता है: विषय = घटना - व्यवहार = विषय = राज्य;
जोनाथन स्टेलवाग

251

BehaviourSubject

BehaviourSubject प्रारंभिक मान या सदस्यता पर वर्तमान मान लौटाएगा

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

आउटपुट के साथ:

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

विषय

सब्स्क्रिप्शन पर सब्जेक्ट का करंट वैल्यू वापस नहीं आता है। यह केवल .next(value)कॉल और रिटर्न / आउटपुट पर ट्रिगर होता है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);

कंसोल पर निम्न आउटपुट के साथ:

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

12
यह और भी सही है: "BehaviourSubject प्रारंभिक मान या सब्सक्रिप्शन पर वर्तमान मान लौटाएगा" एक व्यवहार मान रखने से बेहतर स्पष्टीकरण है। "
डेवी

1
मैंने स्टैकब्लिट्ज़ पर उपरोक्त कोड डाला: stackblitz.com/edit/rxjs-subjectvsbehaviorsubject
Fredrik_Macrobond

प्रेक्षक कहां है: ३?
ओपीवी

@OPV ObserverB: 3 वहाँ है जब आप कॉल करते हैंsubject.next(3);
मोहम्मद


6

यह आपको समझने में मदद कर सकता है।

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

BehaviorSubjectअंतिम मूल्य को ध्यान में रखता है जो अवलोकन योग्य द्वारा उत्सर्जित किया गया था। एक नियमित Subjectनहीं है।

BehaviorSubjectReplaySubject1 के बफर आकार के साथ जैसा है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.