आप अपने कोड के साथ बहुत विशिष्ट नहीं हैं, इसलिए मैं एक परिदृश्य तैयार करूंगा। मान लीजिए कि आपके पास 10 AJAX कॉल हैं और आप उन 10 AJAX कॉल से परिणामों को जमा करना चाहते हैं और फिर जब वे पूरा हो गए हैं तो आप कुछ करना चाहते हैं।
मैनुअल काउंटर
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 कॉल कैसे बना रहे हैं)। आप इस बारे में सोचना चाहेंगे कि आप इस मामले को कैसे संभालने जा रहे हैं जब एक 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 स्टैंडर्ड वादे
As specified in kba's answer: यदि आप मूल अंतर्निहित वादों (आधुनिक ब्राउज़र या Node.js या babeljs transpile का उपयोग कर या एक वादा polyfill का प्रयोग करके) के साथ एक वातावरण है, तो आप ES6 द्वारा निर्दिष्ट वादों का उपयोग कर सकते हैं। ब्राउज़र समर्थन के लिए this table देखें। 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
});
आप एक है कि एक वादा रिटर्न में एक गैर वादा async आपरेशन करने की जरूरत है, तो आप "promisify" यह कर सकते हैं
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
});
0 इस तरह
Bluebird वादे
आप इस आसान बनाने के लिए, Bluebird promise library के रूप में एक और अधिक सुविधा अमीर पुस्तकालय ऐसे का उपयोग करते हैं तो यह में बनाया कुछ अतिरिक्त कार्य करता है:
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
// all ajax results here
}, function(err) {
// some error here
});
एसिंक पर आपका मतलब है कि अजाक्स के अनुरोध को पूरा करने का इंतजार है? –
नोट, 'जबकि (सभी नहीं किए गए हैं) {}' काम नहीं करेगा। जबकि आप व्यस्त-प्रतीक्षा कर रहे हैं, आपकी कोई भी कॉलबैक नहीं चल सकती है। – cHao
हां। मैं एक बाहरी एपीआई को वापस आने के लिए एसिंक कॉल का इंतजार कर रहा हूं ताकि वह कॉलबैक विधियों को आग लगा दे।हाँ cHao, मुझे एहसास हुआ कि, यही कारण है कि मैं यहां मदद के लिए पूछ रहा हूँ: डी – codersarepeople