2012-09-27 21 views
6

मुझे पता है कि Dojo Deferreds के लिए अनुशंसित उपयोग केस dojo.when (def) या def.then() का उपयोग करना है और डिफरर्ड को हल करने के लिए कॉलबैक प्रदान करना है। हालांकि, कभी-कभी मैं दृश्यमान में भाग जाता हूं जहां मुझे वर्तमान धागे के साथ जारी रखने से पहले इसे पूरा करने के लिए वास्तव में प्रतीक्षा करने की आवश्यकता होती है। यहाँ एक उदाहरण (http://jsfiddle.net/DG3Ax/2/ पर पूर्ण उदाहरण)डोजो डेफर्रेड का समाधान होने तक मैं कैसे रोक सकता हूं?

function getSomething() { 
    var def = getSomeDeferred(); 

    def.then(function(result) { 
     dojo.place("<li>def.then() = " + result + "</li>", "output"); 
    }); 

    return def.gimmeTheResultNow(); 
} 

dojo.place("<li>getSomething() = " + getSomething() + "</li>", "output"); 

जाहिर Deferred.gimmeTheResultNow() मौजूद नहीं है, लेकिन है कि कार्यक्षमता मैं तलाश कर रहा हूँ है। मेरे पास कोड कॉलिंग का नियंत्रण नहीं है कुछ(), इसलिए मैं इसे एक डिफरर्ड को संभाल नहीं सकता; इसे वास्तविक परिणाम की आवश्यकता है।

मुझे पता है कि xhrGet() में एक सिंक पैरामीटर है जो मुझे लगता है कि यह एक एजेक्स कॉल था, लेकिन यह आवश्यक नहीं है। क्या इसे पूरा करने का कोई और तरीका है?

+3

मुझे नहीं पता कि आपका स्थगित क्या करता है, लेकिन ऐसा लगता है कि आपको इससे छुटकारा पाना चाहिए। Deferreds गैर-अवरुद्ध, async व्यवहार के लिए हैं। – bfavaretto

उत्तर

4

मैं डोजो ब्याज मेलिंग सूची से एक very helpful answer मिला है, इसलिए मैंने सोचा कि मैं इसे यहाँ रहना चाहते हैं:

दुर्भाग्य से, आप ब्राउज़र में ऐसा नहीं कर सकते।

ब्राउज़र में जावास्क्रिप्ट एकल-थ्रेडेड है। यदि आप के लिए प्रतीक्षा करने के लिए प्रतीक्षा कर रहे हैं, तो आप उस थ्रेड का उपयोग कर रहे हैं। यह थ्रेड है जिसे पर कॉल करने के लिए लाइन के नीचे कहीं भी आवश्यकता होगी Deferred.resolve() (जो स्वयं, फ़ंक्शन को कॉल करने के लिए कॉल करेगा जिसके बाद आप पास हुए थे।)())।

आप एक्सएचआर सिंक्रनाइज़ रूप से कॉल कर सकते हैं क्योंकि XHR के मूल कार्यान्वयन से आप इसे सिंक्रनाइज़ कर सकते हैं। डोजो/डिफरर्ड की कार्यक्षमता एक्सएचआर आंतरिक के आसपास सिर्फ एक रैपर है।