आप अपने कोड के साथ बहुत विशिष्ट नहीं हैं, इसलिए मैं एक परिदृश्य बनाऊंगा। मान लीजिए कि आपके पास 10 अजाक्स कॉल हैं और आप उन 10 अजाक्स कॉल से परिणाम जमा करना चाहते हैं और फिर जब वे सभी पूरे हो गए हैं तो आप कुछ करना चाहते हैं। आप इसे एरे में डेटा को जमा करके और पिछले एक के समाप्त होने पर नज़र रखने के द्वारा ऐसा कर सकते हैं:
मैनुअल काउंटर
var ajaxCallsRemaining = 10;
var returnedData = [];
for (var i = 0; i < 10; i++) {
doAjax(whatever, function(response) {
// success handler from the ajax call
// save response
returnedData.push(response);
// see if we're done with the last ajax call
--ajaxCallsRemaining;
if (ajaxCallsRemaining <= 0) {
// all data is here now
// look through the returnedData and do whatever processing
// you want on it right here
}
});
}
नोट: यहां त्रुटि से निपटने महत्वपूर्ण है (नहीं दिखाया गया है क्योंकि यह विशिष्ट है कि आप अपने अजाक्स कॉल कैसे कर रहे हैं)। आप यह सोचना चाहते हैं कि जब आप एक ajax कॉल कभी भी पूरा नहीं करते हैं, तो एक त्रुटि के साथ या लंबे समय के लिए या लंबे समय के बाद बाहर अटक जाने पर आप मामले को कैसे संभालेंगे।
jQuery के वादे
2014 में मेरे उत्तर को जोड़ते हुए। इन दिनों, वादे अक्सर इस प्रकार की समस्या को हल करने के लिए उपयोग किए जाते हैं क्योंकि jQuery के $.ajax()
पहले से ही एक वादा वापस करता है और $.when()
आपको बताएगा कि जब वादों का एक समूह सभी हल हो जाता है और आपके लिए वापसी परिणाम एकत्र करेगा:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push($.ajax(...));
}
$.when.apply($, promises).then(function() {
// returned data is in arguments[0][0], arguments[1][0], ... arguments[9][0]
// you can process it here
}, function() {
// error occurred
});
ES6 मानक वादे
जैसा कि केबीए के उत्तर में निर्दिष्ट किया गया है : यदि आपके पास अंतर्निहित वादों (आधुनिक ब्राउज़र या नोड.जेएस या बैबलज ट्रांसपाइल का उपयोग करके या एक वादा पॉलीफ़िल का उपयोग करके) के साथ एक वातावरण है, तो आप ईएस 6-निर्दिष्ट वादों का उपयोग कर सकते हैं। ब्राउज़र समर्थन के लिए यह तालिका देखें । IE को छोड़कर बहुत सारे वर्तमान ब्राउज़रों में वादों का समर्थन किया जाता है।
अगर doAjax()
कोई वादा वापस करता है, तो आप ऐसा कर सकते हैं:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
// returned data is in arguments[0], arguments[1], ... arguments[n]
// you can process it here
}, function(err) {
// error occurred
});
यदि आपको वादे के मुताबिक एक गैर-वादा एस्क्वायस ऑपरेशन करना है, तो आप इसे इस तरह "प्रॉमिस" कर सकते हैं:
function doAjax(...) {
return new Promise(function(resolve, reject) {
someAsyncOperation(..., function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
और, फिर ऊपर दिए गए पैटर्न का उपयोग करें:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
// returned data is in arguments[0], arguments[1], ... arguments[n]
// you can process it here
}, function(err) {
// error occurred
});
ब्लूबर्ड वादा करता है
यदि आप अधिक सुविधा संपन्न पुस्तकालय जैसे कि ब्लूबर्ड वादा पुस्तकालय का उपयोग करते हैं , तो इसे आसान बनाने के लिए कुछ अतिरिक्त कार्य किए गए हैं:
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
// all ajax results here
}, function(err) {
// some error here
});