Subject और BehaviorSubject: रिएक्टिव प्रोग्रामिंग की दुनिया के दो भाई-बहन
\n\nयदि आपने कभी Stack Overflow पर "What is the difference between Subject and BehaviorSubject?" चर्चा देखी है, तो आप जानते हैं: यह विषय हजारों व्यूज इकट्ठा करता है। और यह आश्चर्यजनक नहीं है - यह उन प्रश्नों में से एक है जो देर-सबेर TypeScript में RxJS के साथ काम करने वाले हर डेवलपर के सामने आता है।
\n\nकल्पना करें कि आप एक लाइव डेटा प्रसारण का प्रबंधन कर रहे हैं। Subject एक खुले माइक्रोफोन की तरह है: जो पहले सब्सक्राइब करेगा, उसे वही सब कुछ मिलेगा जो बाद में कहा जाएगा। और BehaviorSubject एक माइक्रोफोन है जो हमेशा अंतिम वाक्य को संग्रहीत करता है और तुरंत इसे एक नए श्रोता को दोहराता है। अंतर महसूस कर रहे हैं?
\n\nइस लेख में, हम केवल दस्तावेज़ीकरण को दोबारा नहीं बताएंगे। हम वास्तविक मामलों पर चर्चा करेंगे, TypeScript पर कोड उदाहरण दिखाएंगे और चयन के स्पष्ट नियम देंगे। चलिए शुरू करते हैं!
\n\nTypeScript में Subject क्या है?
\n\nSubject एक विशेष प्रकार का Observable है जो एक साथ Observer भी है। यह next() विधि के माध्यम से डेटा प्राप्त कर सकता है और इसे सभी सब्सक्राइबर्स को भेज सकता है। लेकिन एक महत्वपूर्ण बारीकी है: Subject पिछले मानों को संग्रहीत नहीं करता है।
TypeScript पर एक सरल उदाहरण:
\n\nimport { Subject } from 'rxjs';\n\nconst subject = new Subject<string>();\n\n// डेटा भेजे जाने के बाद सब्सक्राइब करना\nsubject.next('पहला संदेश');\nsubject.next('दूसरा संदेश');\n\n// यह सब्सक्राइबर कुछ भी प्राप्त नहीं करेगा\nsubject.subscribe({\n next: (value) => console.log('सब्सक्राइबर:', value)\n});\n\n// लेकिन यह दिखाई देगा\nsubject.next('तीसरा संदेश');\n\n\nकंसोल में क्या आउटपुट होगा? केवल "सब्सक्राइबर: तीसरा संदेश"। पहले दो संदेश इस सब्सक्राइबर के लिए हमेशा के लिए खो गए हैं। इस प्रभाव को "कोल्ड स्टार्ट" कहा जाता है - आपको केवल वही डेटा मिलता है जो सब्सक्रिप्शन के बाद भेजा गया था।
\n\nBehaviorSubject: जब अतीत को याद रखना आवश्यक हो
\n\nBehaviorSubject वही Subject है, लेकिन एक सुपरपावर के साथ: यह हमेशा अंतिम मान को संग्रहीत करता है और सब्सक्रिप्शन के तुरंत बाद इसे नए सब्सक्राइबर को देता है। अनिवार्य शर्त - प्रारंभिक मान निर्दिष्ट करना आवश्यक है।
\n\nimport { BehaviorSubject } from 'rxjs';\n\nconst behaviorSubject = new BehaviorSubject<string>('प्रारंभिक मान');\n\n// सब्सक्राइब करें - तुरंत अंतिम मान प्राप्त करें\nbehaviorSubject.subscribe({\n next: (value) => console.log('पहला सब्सक्राइबर:', value)\n});\n\nbehaviorSubject.next('पहला अपडेट');\nbehaviorSubject.next('दूसरा अपडेट');\n\n// यह सब्सक्राइबर तुरंत 'दूसरा अपडेट' प्राप्त करेगा\nbehaviorSubject.subscribe({\n next: (value) => console.log('दूसरा सब्सक्राइबर:', value)\n});\n\n\nकंसोल आउटपुट:
\nपहला सब्सक्राइबर: प्रारंभिक मान\nपहला सब्सक्राइबर: पहला अपडेट\nपहला सब्सक्राइबर: दूसरा अपडेट\nदूसरा सब्सक्राइबर: दूसरा अपडेट\n\n\nदेखा? दूसरे सब्सक्राइबर को तुरंत अंतिम मान मिल गया, भले ही उसने बाद में सब्सक्राइब किया। यह BehaviorSubject और Subject के बीच मुख्य अंतर है।
\n\nSubject और BehaviorSubject की तुलना: अंतरों की तालिका
\n\nआइए सभी अंतरों को एक स्पष्ट तालिका में संक्षेपित करें जो साक्षात्कार या वास्तविक प्रोजेक्ट में काम आएगी।
\n\n- \n
- प्रारंभिक मान: Subject - नहीं। BehaviorSubject - अनिवार्य रूप से आवश्यक। \n
- अंतिम मान का भंडारण: Subject - संग्रहीत नहीं करता। BehaviorSubject - संग्रहीत करता है और नए सब्सक्राइबर को देता है। \n
- देर से सब्सक्रिप्शन पर व्यवहार: Subject - सभी पिछली घटनाओं को छोड़ देता है। BehaviorSubject - अंतिम मान देता है। \n
- Angular के साथ उपयोग: Subject - घटनाओं के लिए (क्लिक, टाइमर)। BehaviorSubject - स्थिति के लिए (उपयोगकर्ता डेटा, सेटिंग्स)। \n
- getValue() विधि: Subject - अनुपस्थित। BehaviorSubject - मौजूद है, वर्तमान मान को सिंक्रोनस रूप से लौटाता है। \n