2011-06-30 8 views
47

को समाप्त करने के लिए एकाधिक AJAX अनुरोधों की प्रतीक्षा कर रहा है मेरे पास स्थगित AJAX कॉल की तीन परत गहरी श्रृंखला है, और आदर्श रूप से वे गहराई से परत समाप्त होने पर सभी तरह से वादे को मारने जा रहे हैं (मुझे शुरुआत की बात बना देती है। .. "हमें गहराई में जाने की जरूरत है!")।jQuery डिफर्ड -

समस्या यह है कि मैं एक बार में कई AJAX अनुरोध (संभवतः सैकड़ों) भेज रहा हूं और उन सभी को तब तक स्थगित करने की आवश्यकता है जब तक कि वे सभी नहीं किए जाते। मैं अंतिम आखिरी बार पर भरोसा नहीं कर सकता।

function updateAllNotes() { 
    return $.Deferred(function(dfd_uan) { 
     getcount = 0; 
     getreturn = 0; 
     for (i = 0; i <= index.data.length - 1; i++) { 
      getcount++; 
      $.when(getNote(index.data[i].key)).done(function() { 
       // getNote is another deferred 
       getreturn++ 
      }); 
     }; 
     // need help here 
     // when getreturn == getcount, dfd_uan.resolve() 
    }).promise(); 
}; 
+1

http://stackoverflow.com/questions/3709597/wait-until -all-jquery-ajax-request-are-done/9350515 # 9350515 – Benjamin

उत्तर

95

आप एक से अधिक टाल साथ .when(), और .apply() उपयोग कर सकते हैं। बेहद उपयोगी:

function updateAllNotes() { 
    var getarray = [], 
     i, len; 

    for (i = 0, len = data.length; i < len; i += 1) { 
     getarray.push(getNote(data[i].key)); 
    }; 

    $.when.apply($, getarray).done(function() { 
     // do things that need to wait until ALL gets are done 
    }); 
} 
+8

आप अपने स्वयं के उत्तर को _accept_ भी कर सकते हैं। ऐसा करने से आप उन लोगों की मदद कर सकते हैं जो समान समस्या का सामना कर रहे हैं, क्योंकि वे देखेंगे कि यह समस्या उनके खोज परिणामों में हल हो गई है। :) – Exa

+0

धन्यवाद। स्वीकृत – brittohalloran

+0

के रूप में चिह्नित किया गया है क्या लागू करने के पहले तर्क के रूप में निर्दिष्ट '$' निर्दिष्ट करने का कोई कारण है? मुझे लगता है कि यह कॉल का संदर्भ है, लेकिन एक jQuery कॉल 'विंडो' या शायद' शून्य 'के लिए सामान्य संदर्भ नहीं है? – Ryley

5

उत्तर brittohalloran के लिए धन्यवाद। मैं भी अंडरस्कोर उपयोग कर रहा हूँ, इसलिए मैं नक्शे के साथ बहुत सफाई से अपने समाधान लागू करने में सक्षम था, इस तरह थोड़े:

$.when.apply($, _.map(data, function(i) { 
    return getNote(i.key); 
})).done(function() { 
    alert('Be Happy'); 
}); 

दुष्ट उपयोगी।

25

यदि आप jQuery.When दस्तावेज़ का संदर्भ लेते हैं, यदि आपके AJAX कॉल में से कोई एक विफल रहता है, तो fail मास्टर कॉलबैक को तब भी कॉल किया जाएगा जब सभी निम्नलिखित AJAX कॉल अभी तक समाप्त नहीं हुए हैं। इस मामले में आप सुनिश्चित नहीं हैं कि आपकी सभी कॉल समाप्त हो गई हैं।

आप अपने सभी कॉल के लिए प्रतीक्षा करने के लिए चाहते हैं, कोई बात नहीं क्या परिणाम है, तो आप एक और इस तरह स्थगित उपयोग करना चाहिए:

$.when.apply($, $.map(data, function(i) { 
    var dfd = $.Deferred(); 
    // you can add .done and .fail if you want to keep track of each results individualy 
    getNote(i.key).always(function() { dfd.resolve(); }); 
    return dfd.promise(); 
}); 
+0

मुझे नहीं लगता कि हमेशा हमेशा मदद करता है [अभी भी पहले चलता है वादे पूरा हो गए हैं] (http://jsfiddle.net/katowulf/J7H6M/)। – Kato

+2

हां यह मदद करता है अगर आप मेरे जैसा कोड इस्तेमाल करते हैं और अपने वादों को लपेटते हैं। [मैंने आपके फीड को अपडेट किया है] (http://jsfiddle.net/J7H6M/2/) मेरे उदाहरण के साथ, और यह सही काम करता है। आपके लिंक में, आपने बस ब्रितोहॉलोरन के समान ही किया, दो वादे लपेटे नहीं। इस मामले में, यदि पहला व्यक्ति विफल रहता है, तो असफल/हमेशा कॉलबैक कॉल किए जाएंगे, भले ही अगले वादे समाप्त न हों। – Mordhak