मैं सोच रहा हूं कि इसका क्या उपयोग है asObservable
:
डॉक्स के अनुसार:
एक अवलोकन योग्य अनुक्रम जो स्रोत अनुक्रम की पहचान को छुपाता है।
लेकिन आपको अनुक्रम को छिपाने की आवश्यकता क्यों होगी?
मैं सोच रहा हूं कि इसका क्या उपयोग है asObservable
:
डॉक्स के अनुसार:
एक अवलोकन योग्य अनुक्रम जो स्रोत अनुक्रम की पहचान को छुपाता है।
लेकिन आपको अनुक्रम को छिपाने की आवश्यकता क्यों होगी?
जवाबों:
इसका उद्देश्य एक एपीआई से बाहर के विषय के "पर्यवेक्षक पक्ष" को लीक करने से रोकना है। मूल रूप से एक टपका हुआ अमूर्तता को रोकने के लिए जब आप नहीं चाहते कि लोग परिणामी वेधशाला में "अगले" करने में सक्षम हों।
(नोट: यह वास्तव में नहीं है कि आपको एक ऑब्जर्वेबल में इस तरह से डेटा स्रोत कैसे बनाना चाहिए, इसके बजाय आपको new Observable
कंस्ट्रक्टर का उपयोग करना चाहिए , नीचे देखें)।
const myAPI = {
getData: () => {
const subject = new Subject();
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subject.next({ type: 'message', data });
source.onOtherMessage = (data) => subject.next({ type: 'othermessage', data });
return subject.asObservable();
}
};
अब जब किसी को देखने योग्य परिणाम मिलता है, तो myAPI.getData()
वे next
परिणाम के लिए महत्व नहीं दे सकते हैं :
const result = myAPI.getData();
result.next('LOL hax!'); // throws an error because `next` doesn't exist
new Observable()
, हालांकिऊपर के उदाहरण में, हम शायद कुछ ऐसा बना रहे हैं जिसका हम मतलब नहीं था। एक के लिए, getData()
अधिकांश वेधशालाओं की तरह आलसी नहीं है, यह SomeWeirdDataSource
तुरंत अंतर्निहित डेटा स्रोत (और संभवतः कुछ साइड इफेक्ट्स) बनाने जा रहा है । इसका मतलब यह भी है कि यदि आप retry
या repeat
परिणामी अवलोकन योग्य है, तो यह काम नहीं करने वाला है जैसा आप सोचते हैं कि यह होगा।
बेहतर है कि आपके डेटा स्रोत के निर्माण को आपके अवलोकन योग्य बनाने के लिए समझाया जाए:
const myAPI = {
getData: () => return new Observable(subscriber => {
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subscriber.next({ type: 'message', data });
source.onOtherMessage = (data) => subscriber.next({ type: 'othermessage', data });
return () => {
// Even better, now we can tear down the data source for cancellation!
source.destroy();
};
});
}
ऊपर दिए गए कोड के साथ, RxJS के मौजूदा ऑपरेटरों का उपयोग करके इसे "आलसी नहीं" बनाने सहित किसी भी व्यवहार का पालन किया जा सकता है।
result.subscribe(value => doSomething(value))
return subject.asObservable();
एक नया निरीक्षण करेंगे। आपके पास एक एकल विषय सदस्य चर होगा, और onMessage / onOtherMessage एक शर्त में, या आरंभीकरण (प्रत्येक कॉल नहीं) में घोषित किया जाएगा। मैंने फ़ंक्शन के pipe( filter() )
लिए दिए गए पैरामीटर के आधार पर उस दृष्टिकोण का उपयोग किया है getData()
। द
subject
माना जाता है subscriber
?
subject.next
लाइनें होनी चाहिए subscriber
। इसके अलावा, "यदि आप परिणामी अवलोकन को फिर से दोहराते हैं या दोहराते हैं, तो यह काम करने वाला नहीं है जैसा आप सोचते हैं कि यह होगा।" क्या आप अधिक विशिष्ट हो सकते हैं? क्या आपके कहने का मतलब new SomeWeirdDataSource()
यह है कि हर बार getData
कॉल किया जाता है और इसे new Observable
आप में लपेट कर उस इंस्टेंटेशन का सब्सक्रिप्शन तक इंतजार किया जाता है। मुझे लगता है कि मैं नहीं देखता कि जब आप getData
बिना फोन करेंगे .subscribe
तो मुझे वहाँ मूल्य याद आ रहे हैं। अंत में, "डेटा स्रोत को फाड़ने" के लिए आप क्या कर रहे हैं? धन्यवाद।
एक Subject
दोनों एक के रूप में कार्य कर सकते हैं observer
और एक observable
।
एक Obervable
विधि 2 तरीके हैं।
जब भी आप सदस्यता के एक करने के लिए observable
, आप एक मिल observer
जो अगले , त्रुटि और पूरा उस पर तरीकों।
आपको अनुक्रम छिपाने की आवश्यकता होगी क्योंकि आप नहीं चाहते कि स्ट्रीम स्रोत सार्वजनिक रूप से हर घटक में उपलब्ध हो। आप @BenLesh
उसी के लिए उदाहरण देख सकते हैं ।
पुनश्च: जब मैं पहली बार प्रतिक्रियाशील जावास्क्रिप्ट के माध्यम से आया था, तो मैं समझ नहीं पा रहा था asObservable
। क्योंकि मुझे यह सुनिश्चित करना था कि मैं मूल बातें स्पष्ट रूप से समझूं और फिर जाऊं asObservable
। :)