व्यवहार बनाम अवलोकन योग्य?


690

मैं कोणीय RxJs पैटर्न में देख रहा हूँ और मुझे a BehaviorSubjectऔर a के बीच का अंतर समझ नहीं आ रहा है Observable

मेरी समझ से, एक BehaviorSubjectऐसा मान है जो समय के साथ बदल सकता है (सब्सक्राइब किया जा सकता है और सब्सक्राइबर अपडेट किए गए परिणाम प्राप्त कर सकते हैं)। यह उसी का सटीक उद्देश्य प्रतीत होता है Observable

आप एक Observableबनाम का उपयोग कब करेंगे BehaviorSubject? वहाँ एक BehaviorSubjectसे अधिक Observableया इसके विपरीत का उपयोग करने के लिए लाभ हैं?

जवाबों:


969

BehaviorSubject एक प्रकार का विषय है, एक विषय एक विशेष प्रकार का अवलोकन है, ताकि आप किसी अन्य अवलोकन योग्य संदेश की तरह सदस्यता ले सकें। BehaviorSubject की अनूठी विशेषताएं हैं:

  • इसे एक प्रारंभिक मूल्य की आवश्यकता है क्योंकि यह हमेशा सदस्यता पर एक मूल्य वापस करना चाहिए, भले ही यह प्राप्त न हुआ हो next()
  • सदस्यता लेने पर, यह विषय का अंतिम मूल्य लौटाता है। एक नियमित रूप से देखने योग्य केवल तभी ट्रिगर होता है जब वह प्राप्त करता हैonnext
  • किसी भी बिंदु पर, आप getValue()विधि का उपयोग करके गैर-पर्यवेक्षित कोड में विषय के अंतिम मूल्य को पुनः प्राप्त कर सकते हैं ।

अवलोकन की तुलना में किसी विषय की अनूठी विशेषताएं हैं:

  • यह एक पर्यवेक्षक होने के अलावा एक पर्यवेक्षक है, इसलिए आप इसे सब्स्क्राइब करने के अलावा किसी विषय पर मान भी भेज सकते हैं।

इसके अलावा, आप asObservable()विधि का उपयोग करके व्यवहार विषय से एक अवलोकन प्राप्त कर सकते हैं BehaviorSubject

ऑब्जर्वेबल एक जेनेरिक है, और BehaviorSubjectतकनीकी रूप से ऑब्जर्वेबल का एक उप-प्रकार है क्योंकि व्यवहारसुबिज विशिष्ट गुणों के साथ एक अवलोकन योग्य है।

उदाहरण BehaviorSubject :

// Behavior Subject

// a is an initial value. if there is a subscription 
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a"); 

bSubject.next("b");

bSubject.subscribe(value => {
  console.log("Subscription got", value); // Subscription got b, 
                                          // ^ This would not happen 
                                          // for a generic observable 
                                          // or generic subject by default
});

bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d

उदाहरण 2 नियमित विषय के साथ:

// Regular Subject

let subject = new Subject(); 

subject.next("b");

subject.subscribe(value => {
  console.log("Subscription got", value); // Subscription wont get 
                                          // anything at this point
});

subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d

उपयोग करने Subjectऔर BehaviorSubjectउपयोग करने दोनों से एक अवलोकन बनाया जा सकता है subject.asObservable()

एकमात्र अंतर यह है कि आप एक मानने योग्य next()विधि का उपयोग करने के लिए मान नहीं भेज सकते हैं ।

कोणीय सेवाओं में, मैं BehaviorSubjectएक डेटा सेवा के लिए उपयोग करूंगा क्योंकि एक कोणीय सेवा अक्सर घटक और व्यवहार विषय से पहले शुरू होती है जो यह सुनिश्चित करती है कि सेवा का उपभोग करने वाला घटक अंतिम अपडेट किए गए डेटा को प्राप्त करता है, भले ही इस डेटा के घटक की सदस्यता के बाद से कोई नया अपडेट न हो।


7
मैं नियमित विषय के उदाहरण 2 से थोड़ा भ्रमित हूं। क्यों सब्स्क्राइब नहीं मिलता है दूसरी पंक्ति पर भी आप कुछ भी प्राप्त करते हैं जो आप विषय का उपयोग करके मूल्यों को भेजते हैं ।next ("b")?
jmod999

25
@ jmod999 दूसरा उदाहरण एक नियमित विषय है जिसे सदस्यता प्राप्त करने से पहले एक मूल्य प्राप्त होता है। नियमित विषयों में, सदस्यता को केवल उन मूल्यों के लिए ट्रिगर किया जाता है जिन्हें सदस्यता कहा जाता है। चूंकि सदस्यता से ठीक पहले यह प्राप्त होता है, इसलिए इसे सदस्यता के लिए नहीं भेजा जाता है।
शांतनु भदोरिया

उस शानदार समाधान के बारे में एक नोट, यदि आप इसे किसी फ़ंक्शन में उपयोग करते हैं और इसे वापस करते हैं, तो एक अवलोकन योग्य लौटाएं। मेरे पास एक विषय को वापस करने के साथ कुछ मुद्दे थे, और यह अन्य डेवलपर्स को भ्रमित करता है कि केवल वे ही जानते हैं कि वे ऑब्जर्वबल्स क्या हैं
सैम

8
मेरा बुधवार को एक कोणीय 4 साक्षात्कार था। चूँकि मैं अभी भी नया प्लेटफ़ॉर्म सीख रहा हूं, उसने मुझसे कुछ ऐसा पूछकर मुझे टाल दिया, "क्या होगा अगर मैं एक अवलोकनीय की सदस्यता ले लूं जो कि एक मॉड्यूल में है जो अभी तक आलसी नहीं है?" मुझे यकीन नहीं था, लेकिन उन्होंने मुझे बताया कि इसका उत्तर बीएसबजेक्ट का उपयोग करना था - वास्तव में श्री भदोरिया ने इसे कैसे समझाया। इसका उत्तर बीएसबजेक्ट का उपयोग करना था क्योंकि यह हमेशा नवीनतम मान लौटाता है (कम से कम इस तरह कि मुझे साक्षात्कारकर्ता की अंतिम टिप्पणी याद है)।
bob.mazzo

1
@ bob.mazzo मुझे उस मामले के लिए BSubject का उपयोग करने की आवश्यकता क्यों है? - यदि मैं उस ऑब्जर्वर की सदस्यता लेता हूं तो मुझे कुछ भी प्राप्त नहीं होता क्योंकि प्रेक्षक का प्रारंभ नहीं हुआ है, इसलिए यह पर्यवेक्षकों को डेटा धक्का नहीं दे सकता है और यदि मैं बीएसबजेक्ट का उपयोग करता हूं तो मुझे उसी कारण से कुछ भी प्राप्त नहीं होगा। दोनों मामलों में, ग्राहक को कुछ भी प्राप्त नहीं होता है क्योंकि एक मॉड्यूल के भीतर है जिसे प्रारंभ नहीं किया गया है। क्या मैं सही हू?
राफेल रेयेस

183

अवलोकनीय: प्रत्येक प्रेक्षक के लिए अलग परिणाम

एक बहुत ही महत्वपूर्ण अंतर। चूंकि ऑब्जर्वेबल एक फ़ंक्शन है, इसलिए इसमें कोई भी राज्य नहीं है, इसलिए प्रत्येक नए ऑब्ज़र्वर के लिए, यह बार-बार अवलोकन योग्य कोड निष्पादित करता है। इसका परिणाम यह होगा:

प्रत्येक पर्यवेक्षक के लिए कोड चलाया जाता है। यदि इसकी HTTP कॉल होती है, तो इसे प्रत्येक पर्यवेक्षक के लिए कॉल किया जाता है

यह प्रमुख कीड़े और अक्षमताओं का कारण बनता है

BehaviorSubject (या विषय) पर्यवेक्षक विवरण संग्रहीत करता है, केवल एक बार कोड चलाता है और सभी पर्यवेक्षकों को परिणाम देता है।

उदाहरण के लिए:

JSBin: http://jsbin.com/qowulet/edit?js,console

// --- Observable ---
let randomNumGenerator1 = Rx.Observable.create(observer => {
   observer.next(Math.random());
});

let observer1 = randomNumGenerator1
      .subscribe(num => console.log('observer 1: '+ num));

let observer2 = randomNumGenerator1
      .subscribe(num => console.log('observer 2: '+ num));


// ------ BehaviorSubject/ Subject

let randomNumGenerator2 = new Rx.BehaviorSubject(0);
randomNumGenerator2.next(Math.random());

let observer1Subject = randomNumGenerator2
      .subscribe(num=> console.log('observer subject 1: '+ num));
      
let observer2Subject = randomNumGenerator2
      .subscribe(num=> console.log('observer subject 2: '+ num));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.3/Rx.min.js"></script>

आउटपुट:

"observer 1: 0.7184075243594013"
"observer 2: 0.41271850211336103"
"observer subject 1: 0.8034263165479893"
"observer subject 2: 0.8034263165479893"

निरीक्षण करें कि Observable.createप्रत्येक पर्यवेक्षक के लिए अलग-अलग आउटपुट का उपयोग कैसे किया जाए , लेकिन BehaviorSubjectसभी पर्यवेक्षकों के लिए समान आउटपुट दिया। यह महत्वपूर्ण है।


अन्य अंतर संक्षेप में।

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃         Observable                  ┃     BehaviorSubject/Subject         ┃      
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ 
┃ Is just a function, no state        ┃ Has state. Stores data in memory    ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Code run for each observer          ┃ Same code run                       ┃
┃                                     ┃ only once for all observers         ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Creates only Observable             ┃Can create and also listen Observable┃
┃ ( data producer alone )             ┃ ( data producer and consumer )      ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ Usage: Simple Observable with only  ┃ Usage:                              ┃
┃ one Obeserver.                      ┃ * Store data and modify frequently  ┃
┃                                     ┃ * Multiple observers listen to data ┃
┃                                     ┃ * Proxy between Observable  and     ┃
┃                                     ┃   Observer                          ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

3
कोई भी व्यक्ति KnockoutJS's ko.observable()तुरंत आकर Rx.BehaviorSubjectतुलना करने के लिए अधिक समानताएं देखेगाRx.Observable
सिमोन_विवर

@Skeptor वेधशाला : सदस्यता विधि हमेशा पर्यवेक्षक के साथ जुड़े onNext विधि को ट्रिगर करेगी और रिटर्न वैल्यू लाएगी। BehaviourSubject / Subject: स्ट्रीम में हमेशा नवीनतम मान लौटाएगा। विषय के साथ यहां उप-विधि विधि अपने ऑब्जर्वर के onNext विधि को ट्रिगर नहीं करेगी जब तक कि यह धारा में नवीनतम मूल्य को न पा ले।
मोहन राम

62

नमूदार और विषय दोनों नमूदार के साधन एक पर्यवेक्षक उन्हें ट्रैक कर सकते हैं कर रहे हैं। लेकिन दोनों में कुछ अनोखी विशेषताएं हैं। इसके अलावा कुल 3 प्रकार के विषय हैं उनमें से प्रत्येक में फिर से अद्वितीय विशेषताएं हैं। चलो उनमें से प्रत्येक को समझने की कोशिश करते हैं।

आप स्टैकब्लिट्ज़ पर यहां व्यावहारिक उदाहरण पा सकते हैं । (वास्तविक आउटपुट को देखने के लिए आपको कंसोल की जांच करने की आवश्यकता है)

यहाँ छवि विवरण दर्ज करें

Observables

वे ठंडे होते हैं: कोड तब निष्पादित होता है जब उनके पास कम से कम एक पर्यवेक्षक होता है।

डेटा की प्रतिलिपि बनाता है: ऑब्जर्वेबल प्रत्येक पर्यवेक्षक के लिए डेटा की प्रतिलिपि बनाता है।

यूनी-डायरेक्शनल: ऑब्जर्वर ऑब्जर्वेबल (मूल / मास्टर) को मान नहीं दे सकता है।

Subject

वे गर्म हैं: कोड निष्पादित हो जाता है और कोई पर्यवेक्षक न होने पर भी मूल्य प्रसारित हो जाता है।

शेयर डेटा: एक ही डेटा सभी पर्यवेक्षकों के बीच साझा किया जाता है।

द्वि-दिशात्मक: प्रेक्षक पर्यवेक्षित (मूल / मास्टर) को मान प्रदान कर सकता है।

यदि आप विषय का उपयोग कर रहे हैं तो आप उन सभी मूल्यों को याद करते हैं जो पर्यवेक्षक के निर्माण से पहले प्रसारित किए जाते हैं। तो यहाँ आता है Replay Subject

ReplaySubject

वे गर्म हैं: कोड निष्पादित हो जाता है और कोई पर्यवेक्षक न होने पर भी मूल्य प्रसारित हो जाता है।

शेयर डेटा: एक ही डेटा सभी पर्यवेक्षकों के बीच साझा किया जाता है।

द्वि-दिशात्मक: प्रेक्षक पर्यवेक्षित (मूल / मास्टर) को मान प्रदान कर सकता है। प्लस

मैसेज स्ट्रीम फिर से करें: कोई बात नहीं जब आप रिप्ले सब्जेक्ट को सब्स्क्राइब करेंगे तो आपको सभी ब्रॉडकास्ट किए हुए मैसेज मिलेंगे।

सब्जेक्ट और रीप्ले सब्जेक्ट में आप ऑब्जर्वेबल के लिए शुरुआती वैल्यू सेट नहीं कर सकते। इसलिए यहां बिहेवियरल सब्जेक्ट आता है

BehaviorSubject

वे गर्म हैं: कोड निष्पादित हो जाता है और कोई पर्यवेक्षक न होने पर भी मूल्य प्रसारित हो जाता है।

शेयर डेटा: एक ही डेटा सभी पर्यवेक्षकों के बीच साझा किया जाता है।

द्वि-दिशात्मक: प्रेक्षक पर्यवेक्षित (मूल / मास्टर) को मान प्रदान कर सकता है। प्लस

मैसेज स्ट्रीम फिर से करें: कोई बात नहीं जब आप रिप्ले सब्जेक्ट को सब्स्क्राइब करेंगे तो आपको सभी ब्रॉडकास्ट किए हुए मैसेज मिलेंगे।

आप प्रारंभिक मूल्य निर्धारित कर सकते हैं: आप अवलोकन को डिफ़ॉल्ट मान के साथ आरंभ कर सकते हैं।


3
उल्लेख के लायक हो सकता है कि एक ReplaySubjectइतिहास है और (पुराने) मूल्यों के अनुक्रम को प्रसारित / उत्सर्जित कर सकता है। केवल जब बफर को 1 पर सेट किया जाता है तो यह ए के समान व्यवहार करता है BehaviorSubject
विल्ट

28

ऑब्जर्वेबल ऑब्जेक्ट एक पुश आधारित संग्रह का प्रतिनिधित्व करता है।

ऑब्जर्वर और ऑब्जर्वेबल इंटरफेस पुश-आधारित अधिसूचना के लिए एक सामान्यीकृत तंत्र प्रदान करते हैं, जिसे पर्यवेक्षक डिजाइन पैटर्न के रूप में भी जाना जाता है। ऑब्ज़र्वेबल ऑब्जेक्ट उस ऑब्जेक्ट का प्रतिनिधित्व करता है जो सूचनाएं (प्रदाता) भेजता है; प्रेक्षक वस्तु उस वर्ग का प्रतिनिधित्व करती है जो उन्हें (पर्यवेक्षक) प्राप्त करता है।

सब्जेक्ट क्लास ऑब्जर्वबल और ऑब्जर्वर दोनों को इस अर्थ में विरासत में मिला है कि यह ऑब्जर्वर और ऑब्जर्वेबल दोनों है। आप सभी पर्यवेक्षकों की सदस्यता के लिए किसी विषय का उपयोग कर सकते हैं, और फिर बैकएंड डेटा स्रोत के लिए विषय की सदस्यता ले सकते हैं

var subject = new Rx.Subject();

var subscription = subject.subscribe(
    function (x) { console.log('onNext: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted'); });

subject.onNext(1);
// => onNext: 1

subject.onNext(2);
// => onNext: 2

subject.onCompleted();
// => onCompleted

subscription.dispose();

Https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md पर अधिक


Subs.dispose () और membership.unsubscribe () के बीच अंतर क्या है?
choopage

4
@ कोई अंतर नहीं। उत्तरार्द्ध नया तरीका है
रॉय नमिर

विषय के निपटान से पहले सदस्यता समाप्त कर लेनी चाहिए, अन्यथा, सदस्यता एक कचरा बन जाती है क्योंकि यह एक शून्य मान के लिए सदस्यता लेती है।
सोफी झांग

20

एक बात जो मैं उदाहरणों में नहीं देख पा रहा हूं वह यह है कि जब आप BehaviorSubject को ऑब्जर्वेबल के माध्यम से asObservable में डालते हैं, तो यह सदस्यता पर अंतिम मान वापस करने का व्यवहार विरासत में मिलता है।

यह मुश्किल सा है, क्योंकि अक्सर पुस्तकालयों को खेतों के रूप में देखा जा सकेगा (यानी एंग्ल्युरेट 2 में एंग्रीडिएटआउट में पैरामेट्स), लेकिन पर्दे के पीछे सब्जेक्ट या बिहेवियरसुबजेक्ट का उपयोग कर सकते हैं। वे जो उपयोग करते हैं वह सदस्यता के व्यवहार को प्रभावित करेगा।

यहां देखें http://jsbin.com/ziquxapubo/edit?html,js,console

let A = new Rx.Subject();
let B = new Rx.BehaviorSubject(0);

A.next(1);
B.next(1);

A.asObservable().subscribe(n => console.log('A', n));
B.asObservable().subscribe(n => console.log('B', n));

A.next(2);
B.next(2);

11

एक नमूदार आपको केवल सदस्यता लेने की अनुमति देता है जबकि एक विषय आपको प्रकाशित और सदस्यता दोनों की अनुमति देता है।

तो एक विषय आपकी सेवाओं को एक प्रकाशक और ग्राहक दोनों के रूप में उपयोग करने की अनुमति देता है ।

अब तक, मैं इतना अच्छा नहीं हूँ Observableइसलिए मैं इसका केवल एक उदाहरण साझा करूँगा Subject

आइए एक कोणीय सीएलआई उदाहरण के साथ बेहतर समझें । नीचे दिए गए आदेश चलाएँ:

npm install -g @angular/cli

ng new angular2-subject

cd angular2-subject

ng serve

की सामग्री को इसके app.component.htmlसाथ बदलें :

<div *ngIf="message">
  {{message}}
</div>

<app-home>
</app-home>

ng g c components/homeहोम कंपोनेंट जेनरेट करने के लिए कमांड रन करें । की सामग्री को इसके home.component.htmlसाथ बदलें :

<input type="text" placeholder="Enter message" #message>
<button type="button" (click)="setMessage(message)" >Send message</button>

#messageयहाँ स्थानीय चर है। एक संपत्ति message: string; को app.component.tsवर्ग में जोड़ें।

यह आदेश चलाएँ ng g s service/message । यह पर एक सेवा उत्पन्न करेगा src\app\service\message.service.tsइस सेवा को ऐप को प्रदान करें

आयात SubjectमेंMessageService । एक विषय भी जोड़ें। अंतिम कोड इस तरह दिखेगा:

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class MessageService {

  public message = new Subject<string>();

  setMessage(value: string) {
    this.message.next(value); //it is publishing this value to all the subscribers that have already subscribed to this message
  }
}

अब, इस सेवा को इसमें इंजेक्ट करें home.component.tsऔर इसका एक उदाहरण कंस्ट्रक्टर को दें। इसके लिए app.component.tsभी करें। #messageसेवा फ़ंक्शन के मान को पास करने के लिए इस सेवा उदाहरण का उपयोग करेंsetMessage :

import { Component } from '@angular/core';
import { MessageService } from '../../service/message.service';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent {

  constructor(public messageService:MessageService) { }

  setMessage(event) {
    console.log(event.value);
    this.messageService.setMessage(event.value);
  }
}

अंदर app.component.ts, सदस्यता और सदस्यता समाप्त (स्मृति लीक को रोकने के लिए)Subject :

import { Component, OnDestroy } from '@angular/core';
import { MessageService } from './service/message.service';
import { Subscription } from 'rxjs/Subscription';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'
})
export class AppComponent {

  message: string;
  subscription: Subscription;

  constructor(public messageService: MessageService) { }

  ngOnInit() {
    this.subscription = this.messageService.message.subscribe(
      (message) => {
        this.message = message;
      }
    );
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

बस।

अब, किसी भी मूल्य के अंदर प्रवेश किया #messageके home.component.htmlलिए मुद्रित किया जाएगा {{message}}अंदरapp.component.html


विशाल छवि क्यों? यदि यह सीधे आपके उत्तर से संबंधित नहीं है, तो यह वोटबेट की तरह लगता है।
Ruffin

@ruffin यह केवल औसत वोटों के साथ औसत उत्तर है, मेरी प्रोफ़ाइल देखें। निश्चित रूप से वोटबेट नहीं: D
xameeramir

1
मैंने आपको पहले एक अपवोट दिया था, लेकिन आपने इस सवाल को चकमा दिया है कि छवि क्यों है। यह सीधे आपके उत्तर से संबंधित नहीं है। इससे कोई फ़र्क नहीं पड़ता कि आपको बहुत सारे प्रतिनिधि मिले या नहीं - अगर छवि सीधे और विशेष रूप से मायावी नहीं है, तो मैं आपसे इसे हटाने का अनुरोध करूंगा । / श्रग
रफ़िन

1
@ क्रुफ़िन अगर यह समुदाय की सहमति के खिलाफ जाता है, तो यह निश्चित रूप से नहीं होना चाहिए!
xameeramir

4

app.component.ts

behaviourService.setName("behaviour");

behaviour.service.ts

private name = new BehaviorSubject("");
getName = this.name.asObservable();`

constructor() {}

setName(data) {
    this.name.next(data);
}

custom.component.ts

behaviourService.subscribe(response=>{
    console.log(response);    //output: behaviour
});

1

BehaviorSubject vs Observable : RxJS में पर्यवेक्षक और वेधशालाएं हैं, Rxjs डेटा धाराओं के साथ उपयोग करने के लिए एक से अधिक क्लासेस प्रदान करता है, और उनमें से एक BehaviorSubject है।

वेधशालाएँ : वेधशालाएँ समय के साथ कई मूल्यों का आलसी संग्रह हैं।

BehaviorSubject : एक विषय जिसके लिए प्रारंभिक मूल्य की आवश्यकता होती है और नए ग्राहकों के लिए अपने वर्तमान मूल्य का उत्सर्जन करता है।

 // RxJS v6+
import { BehaviorSubject } from 'rxjs';

const subject = new BehaviorSubject(123);

//two new subscribers will get initial value => output: 123, 123
subject.subscribe(console.log);
subject.subscribe(console.log);

//two subscribers will get new value => output: 456, 456
subject.next(456);

//new subscriber will get latest value (456) => output: 456
subject.subscribe(console.log);

//all three subscribers will get new value => output: 789, 789, 789
subject.next(789);

// output: 123, 123, 456, 456, 456, 789, 789, 789

1

वेधशालाओं के बारे में सोचें कि उसमें बहता पानी है, कभी पानी बहता है और कभी नहीं। कुछ मामलों में, आपको वास्तव में एक पाइप की आवश्यकता हो सकती है जिसमें हमेशा पानी होता है, आप एक विशेष पाइप बनाकर ऐसा कर सकते हैं जिसमें हमेशा पानी होता है चाहे वह कितना भी छोटा क्यों न हो, इस विशेष पाइप को कॉल करें BehaviorSubject , यदि आप भी है आपके समुदाय में एक पानी की आपूर्ति प्रदाता, आप रात में शांति से सो सकते हैं यह जानकर कि आपका नया स्थापित पाइप बस काम करता है।

तकनीकी शब्दों में: आप उन उपयोगकताओं से सामना कर सकते हैं जहां एक ऑब्जर्वेबल का हमेशा मूल्य होना चाहिए, शायद आप समय के साथ एक इनपुट पाठ के मूल्य पर कब्जा करना चाहते हैं, तो आप इस तरह के व्यवहार को सुनिश्चित करने के लिए BehaviorSubject का एक उदाहरण बना सकते हैं, हम कहते हैं:


const firstNameChanges = new BehaviorSubject("<empty>");

// pass value changes.
firstNameChanges.next("Jon");
firstNameChanges.next("Arya");

आप समय के साथ नमूना परिवर्तन के लिए "मूल्य" का उपयोग कर सकते हैं।


firstNameChanges.value;

यह तब काम आता है जब आप ऑब्जर्वबल्स को बाद में जोड़ते हैं, अपनी स्ट्रीम के प्रकार पर एक नज़र डालते हुए BehaviorSubject के रूप में आप तब यह सुनिश्चित कर सकते हैं कि स्ट्रीम कम से कम आग या सिग्नल कम से कम एक बार कम से कम हो

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