2011-11-10 15 views
27

के एक सरल आस्थगित वस्तु बनाएँ:किसी डिफरर्ड ऑब्जेक्ट और अपने स्वयं के वादे ऑब्जेक्ट के बीच क्या अंतर है?

defer = $.Deferred(function (defer) { 
    setTimeout(defer.resolve, 3000); 
}); 

ऊपर आस्थगित वस्तु 3 सेकंड के लिए "लंबित" राज्य में हो जाएगा, और फिर "का समाधान" राज्य के लिए स्विच (जिस पर सभी कॉलबैक करने के लिए बाध्य बात इसे बुलाया जाएगा)। , हम .done() या .then() उपयोग कर सकते हैं

promise = defer.promise(); 

अब, कॉलबैक जो एक बार स्थगित वस्तु हल हो गई है लागू किया जा करने के लिए जा रहे हैं जोड़ने के लिए:

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

defer.then(handler); 

या

promise.then(handler); 

दोनों मामलों में, handler समारोह द्वारा सक्रिय किया जाएगा (इस मामले में 3 सेकंड के बाद)।

अगर हम $.when उपयोग करते हैं, हम फिर से स्थगित वस्तु या उसके वादा वस्तु पारित कर सकते हैं:

$.when(defer).then(handler); 

या

$.when(promise).then(handler); 

फिर, कोड की उपरोक्त दो लाइनों के बीच कोई अंतर नहीं है ।

लाइव डेमो:http://jsfiddle.net/G6Ad6/

तो, मेरे सवाल है क्योंकि हम आस्थगित वस्तु पर ही .then(), .done(), आदि आह्वान कर सकते हैं और तब से हम $.when() में है कि आस्थगित वस्तु पारित कर सकते हैं, .promise() की बात क्या है और वादा वस्तु को पुनः प्राप्त करना? वादा वस्तु का उद्देश्य क्या है? कार्यक्षमता में यह अनावश्यकता क्यों है?

उत्तर

23

यह .resolve() और .reject() विधियों के बिना स्थगित मूल्य की "मुहरबंद" प्रतिलिपि बनाता है। the documentation से:

deferred.promise() विधि एक अतुल्यकालिक समारोह प्रगति या अपने आंतरिक अनुरोध की स्थिति में हस्तक्षेप करने से अन्य कोड को रोकने के लिए अनुमति देता है।

इसका उपयोग तब किया जाता है जब मूल्य को संशोधित करने के लिए यह समझ में नहीं आता है। उदाहरण के लिए, जब jQuery एक AJAX अनुरोध करता है तो यह एक वादा ऑब्जेक्ट देता है। आंतरिक रूप से यह .resolve() मूल Deferred ऑब्जेक्ट के लिए एक मान है, जिसे उपयोगकर्ता वादे के साथ देखता है।

+1

आह यह एक सीलबंद प्रति * duh * है ... जो इसे समझाता है। –

+1

इस पर जोड़ने के लिए जो मुझे [डॉक्स] (http://api.jquery.com/Types/# समझौता) से बहुत स्पष्ट बनाता है: "वादा ऑब्जेक्ट - यह ऑब्जेक्ट के तरीकों का सबसेट प्रदान करता है उपयोगकर्ताओं को डिफरर्ड की स्थिति बदलने से रोकने के लिए डिफरर्ड ऑब्जेक्ट (फिर, किया गया, असफल, हमेशा, पाइप, और राज्य)। " –

2

किसी डिफरर्ड ऑब्जेक्ट के "वादे" का उपयोग करते समय पर्यवेक्षकों (उदाहरण के लिए संकल्प के लिए प्रतीक्षा करने वाले ऑब्जेक्ट्स) को डिफरर्ड ऑब्जेक्ट पर सीधे पहुंच नहीं होती है, इसलिए वे उदाहरण के लिए कॉल नहीं कर सकते हैं, विधि "हल" वह निराश यह मूल Deferred की रक्षा का एक तरीका है।

0

डिफरर्ड के साथ, आप अपने राज्य set को नियंत्रित कर सकते हैं।

जब वादा की बात आती है, तो आप राज्य पढ़ सकते हैं और शायद कॉलबैक संलग्न कर सकते हैं। get

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