2016-08-04 22 views
6

को समझने की समझ में मैंने प्रतिक्रियाशील में उपयोग डिफ्रर की खोज की, लेकिन फिर भी मुझे समझ में नहीं आता कि क्यों और कब डिफर विधि का उपयोग करें।आरएक्सजेएस,

जैसा कि मैं समझता हूं कि सभी अवलोकन करने योग्य विधि को तब तक नहीं निकाल दिया जाएगा जब तक कि यह सब्सक्राइब नहीं किया जाता है, तो हमें अवलोकन विधि को स्थगित विधि से लपेटने की आवश्यकता क्यों है?

कृपया मुझे सलाह दें, और उदाहरण के साथ मुझे देने पर बहुत सराहना की जाएगी।

[अपडेटेड]

अब मैं समझ गया।

प्रतिक्रियाशील प्रलेखन में, मैं इस उदाहरण देखा था,

var source = Rx.Observable.defer(function() { 
    return Rx.Observable.return(42); 
}); 

var subscription = source.subscribe(
    function (x) { console.log('Next: ' + x); }, 
    function (err) { console.log('Error: ' + err); }, 
    function() { console.log('Completed'); }); 

और मैंने सोचा था,

कारण है कि यह लिपटे आस्थगित करें साथ प्रत्यक्ष विधि? यह अलग तरीके से कैसे कार्य करेगा?

उत्तर

12

केवल, क्योंकि Observables सूत्रों के विभिन्न प्रकार संपुटित और कर सकते हैं उन स्रोतों जरूरी है कि इंटरफ़ेस का पालन करना नहीं है। Promises जैसे कुछ हमेशा बेसब्री से प्रतिस्पर्धा करने का प्रयास करते हैं।

पर विचार करें: किसी भी संचालकों कनेक्ट किया गया है से पहले

var promise = $.get('https://www.google.com'); 

इस मामले में वादा पहले से ही क्रियान्वित कर रहा है। अगर हम इसे Observable की तरह अधिक कार्य करना चाहते हैं तो हमें को किसी सब्सक्रिप्शन तक वादे का निर्माण करने की आवश्यकता है।

इसलिए हम defer का उपयोग ऐसे ब्लॉक को बनाने के लिए करते हैं जो केवल Observable की सदस्यता लेने पर निष्पादित हो जाता है।

Observable.defer(() => $.get('https://www.google.com')); 

ऊपर PromiseObservable तक की सदस्यता ली हो जाता है नहीं बनाएगा और इस प्रकार बहुत मानक Observable इंटरफेस के साथ लाइन में और अधिक बर्ताव होगा।

+0

@AlexPineda सुनिश्चित नहीं है कि आपका क्या मतलब है। 'defer' पहले से ही' वादे 'को समझता है, इसलिए यह पहले से ही उन्हें संभालता है, इसलिए आपको' समझौता 'की आवश्यकता नहीं होगी जबतक कि आप इसका उपयोग स्पष्ट नहीं करना चाहते थे। – paulpdaniels

संबंधित मुद्दे