2013-06-27 9 views
5

मेरे पास डोजो/डिफरर्ड के बारे में एक प्रश्न है। मैं सवाल के साथ शुरू करेंगे, तो क्या मैं कर रहा हूँ के बारे में अधिक विस्तार में जाने:Dojo Deferred ऑब्जेक्ट के बाद सामान्य कोड को निष्पादित करने के लिए कैसे हल किया गया है या अस्वीकार कर दिया गया है?

वहाँ आस्थगित, एक तरह से में एक finally ब्लॉक की तरह के परिणाम की परवाह किए बिना कोड की उसी तर्ज पर अमल करने का कोई तरीका है try...catch कथन? जो मैंने पढ़ा है, उससे ऐसा प्रतीत नहीं होता है, लेकिन शायद मैं दस्तावेज को गलत समझ रहा हूं और एसओ समुदाय के साथ इसे सत्यापित करना चाहता हूं।

यहाँ मैं क्या कर रहा है:

डोजो 1.9 (भी 1.8 में काम करता है) में, मैं एक dojox.widget.Standby (एक लोडिंग ओवरले) एक contentPane लिए कुछ डेटा लोड करने से पहले का दृष्टांत। आस्थगित कॉल पूरा हो जाने के बाद, मैं अपने ओवरले को छिपाने के लिए के रूप में नीचे दिखाया गया हैं:

standby = new Standby({ 
    ... // standby props 
}); 
this.addChild(standby); 
standby.show(); 

queryResults = grid.store.query({ 
    ... // query props 
}); 
queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 

    standby.hide(); 
}, function (error) { 
    ... // handle error 

    standby.hide(); 
}); 

यह ठीक काम करता है; हालांकि, संभवतः, मेरे पास स्थगित पूर्ण होने के बाद कुछ प्रक्रियाएं लागू हो सकती हैं जो केवल एक पंक्ति के बजाय कोड की कई पंक्तियां लेती हैं और मैं कोड की उन पंक्तियों को डुप्लिकेट नहीं करना चाहूंगा। एक विकल्प होगा एक निजी समारोह बनाना और बस इसे प्रत्येक ब्लॉक में एक लाइनर के साथ बुलाओ, लेकिन यदि कोई बेहतर तरीका है, तो मैं उस मार्ग को लेना चाहता हूं।

अग्रिम धन्यवाद!

उत्तर

5

अंतर्निहित Deferred सफल होने या विफल होने के बावजूद आप फ़ंक्शन निष्पादित करने के लिए वादा API के always विधि का उपयोग कर सकते हैं।

queryResult 
    .then(onSuccess, onFailure) 
    .always(function() { 
     standby.hide(); 
    }); 
2

यह एक अच्छा सवाल है। ऑब्जेक्ट एक और डिफरर्ड ऑब्जेक्ट लौटाएगा जब Deferred#then कहा जाता है। यह आपको एक धारावाहिक क्रम में निकाल दिए गए कई कॉलबैक के साथ एक भिन्न श्रृंखला को श्रृंखलाबद्ध करने की अनुमति देता है। इसलिए, मेरा मानना ​​है कि आप कुछ इस तरह कर सकते हैं: तुम्हें पता है, दूसरा Deferred#then को कॉलबैक निकाल दिया जाता है कर सकते हैं see this example fiddle है कि एक समान दिखाता है, सरल, उपयोग के मामले जहां यद्यपि अगर स्थगित अस्वीकार कर दिया या हल हो गई है की परवाह किए बिना

queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 
}, function (error) { 
    ... // handle error 
}).then(function(data){ 
    // This will be fired with data returned from the previous callback. 
    standby.hide(); 
}); 

प्रारंभिक त्रुटि/सफलता कॉलबैक के बाद।

+0

दोनों आप और @Lucas मेरे सवाल का जवाब दे दिया है के बाद से अपने जवाब के दोनों सही हैं। मैंने @ लुकास को 'सर्वश्रेष्ठ उत्तर' दिया क्योंकि मुझे लगता है कि 'हमेशा' एक अतिरिक्त 'तत्काल' से एक स्पष्ट इरादा का प्रतिनिधित्व करता है। लेकिन मैंने आपकी जवाब को अपनी शुद्धता के लिए वोट दिया। – David

-1
var deferred = new Deferred(); 
deferred.promise.always(function() { alert('ciao'); }); 
+0

यह मौजूदा उत्तरों पर कुछ भी जोड़ने के लिए प्रतीत नहीं होता है। – Bergi

+0

हां यह करता है, deffered वादा बढ़ाता है, तो मैं .then() फ़ंक्शन को कॉल किए बिना वार्तालाप संपत्ति का उपयोग करता हूं और कॉलबैक फ़ंक्शंस सेट करता हूं। – max4ever

+0

अन्य उत्तरों '.then()' का उपयोग करते हैं क्योंकि ओपी को उन परिणामों-निर्भर कॉलबैक कार्यों की भी आवश्यकता होती है। – Bergi

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