Rxjs में asObservable () का उपयोग कब करें?


87

मैं सोच रहा हूं कि इसका क्या उपयोग है asObservable:

डॉक्स के अनुसार:

एक अवलोकन योग्य अनुक्रम जो स्रोत अनुक्रम की पहचान को छुपाता है।

लेकिन आपको अनुक्रम को छिपाने की आवश्यकता क्यों होगी?

जवाबों:


189

Subject.prototype.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 के मौजूदा ऑपरेटरों का उपयोग करके इसे "आलसी नहीं" बनाने सहित किसी भी व्यवहार का पालन किया जा सकता है।


3
TX बेन ... आपके सामान का अनुसरण कर रहा है ... RX पर सभी महान समर्थन के लिए tx
जन्म

3
@ शार्दुल ... आप परिणाम के लिए सदस्यता लेंगे:result.subscribe(value => doSomething(value))
बेन लेश

2
@BenTaliadoros हाँ, हर बार जब आप return subject.asObservable();एक नया निरीक्षण करेंगे। आपके पास एक एकल विषय सदस्य चर होगा, और onMessage / onOtherMessage एक शर्त में, या आरंभीकरण (प्रत्येक कॉल नहीं) में घोषित किया जाएगा। मैंने फ़ंक्शन के pipe( filter() )लिए दिए गए पैरामीटर के आधार पर उस दृष्टिकोण का उपयोग किया है getData()। द
द्रेनई

5
@BenLesh, आपके दूसरे कोड नमूने में subjectमाना जाता है subscriber?
फ्लोरिन डी

1
मैं यहां सत्यापन भी करना चाहूंगा: subject.nextलाइनें होनी चाहिए subscriber। इसके अलावा, "यदि आप परिणामी अवलोकन को फिर से दोहराते हैं या दोहराते हैं, तो यह काम करने वाला नहीं है जैसा आप सोचते हैं कि यह होगा।" क्या आप अधिक विशिष्ट हो सकते हैं? क्या आपके कहने का मतलब new SomeWeirdDataSource()यह है कि हर बार getDataकॉल किया जाता है और इसे new Observableआप में लपेट कर उस इंस्टेंटेशन का सब्सक्रिप्शन तक इंतजार किया जाता है। मुझे लगता है कि मैं नहीं देखता कि जब आप getDataबिना फोन करेंगे .subscribeतो मुझे वहाँ मूल्य याद आ रहे हैं। अंत में, "डेटा स्रोत को फाड़ने" के लिए आप क्या कर रहे हैं? धन्यवाद।
१२५२ 22४48

7

एक Subjectदोनों एक के रूप में कार्य कर सकते हैं observerऔर एक observable

एक Obervableविधि 2 तरीके हैं।

  • सदस्यता लेने के
  • सदस्यता समाप्त

जब भी आप सदस्यता के एक करने के लिए observable, आप एक मिल observerजो अगले , त्रुटि और पूरा उस पर तरीकों।

आपको अनुक्रम छिपाने की आवश्यकता होगी क्योंकि आप नहीं चाहते कि स्ट्रीम स्रोत सार्वजनिक रूप से हर घटक में उपलब्ध हो। आप @BenLeshउसी के लिए उदाहरण देख सकते हैं ।

पुनश्च: जब मैं पहली बार प्रतिक्रियाशील जावास्क्रिप्ट के माध्यम से आया था, तो मैं समझ नहीं पा रहा था asObservable। क्योंकि मुझे यह सुनिश्चित करना था कि मैं मूल बातें स्पष्ट रूप से समझूं और फिर जाऊं asObservable। :)

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