Vous n'avez pas été très précis avec votre code, alors je vais inventer un scénario. Supposons que vous ayez 10 appels ajax et que vous vouliez accumuler les résultats de ces 10 appels ajax, puis quand ils ont tous terminé, vous voulez faire quelque chose. Vous pouvez le faire comme ceci en accumulant les données dans un tableau et en gardant une trace de la fin du dernier:
Compteur manuel
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
}
});
}
Remarque: la gestion des erreurs est importante ici (non affichée car elle est spécifique à la façon dont vous effectuez vos appels ajax). Vous voudrez peut-être réfléchir à la manière dont vous allez gérer le cas où un appel ajax ne se termine jamais, soit avec une erreur, soit bloqué pendant une longue période ou expire après un long moment.
Promesses jQuery
Ajout à ma réponse en 2014. Ces jours-ci, les promesses sont souvent utilisées pour résoudre ce type de problème puisque jQuery's $.ajax()
retourne déjà une promesse et vous $.when()
fera savoir quand un groupe de promesses sont toutes résolues et collectera les résultats de retour pour vous:
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
});
Promesses standard ES6
Comme spécifié dans la réponse de kba : si vous avez un environnement avec des promesses natives intégrées (navigateur moderne ou node.js ou utilisant babeljs transpile ou utilisant un promesse polyfill), vous pouvez utiliser les promesses spécifiées par ES6. Consultez ce tableau pour la prise en charge du navigateur. Les promesses sont prises en charge dans à peu près tous les navigateurs actuels, à l'exception d'IE.
Si doAjax()
retourne une promesse, vous pouvez le faire:
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
});
Si vous avez besoin de transformer une opération asynchrone sans promesse en une opération qui renvoie une promesse, vous pouvez la «promettre» comme ceci:
function doAjax(...) {
return new Promise(function(resolve, reject) {
someAsyncOperation(..., function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
Et, puis utilisez le modèle ci-dessus:
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
});
Promesses Bluebird
Si vous utilisez une bibliothèque plus riche en fonctionnalités, telle que la bibliothèque de promesses Bluebird , elle possède des fonctions supplémentaires intégrées pour vous faciliter la tâche:
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
// all ajax results here
}, function(err) {
// some error here
});