Vous n'avez pas été très spécifique avec votre code, donc je vais créer un scénario. Disons que vous avez 10 appels ajax et que vous voulez accumuler les résultats de ces 10 appels ajax, puis quand ils sont tous terminés, vous voulez faire quelque chose. Vous pouvez le faire comme ceci en accumulant les données dans un tableau et en suivant quand le dernier a fini :
Compteur Manuel
var ajaxCallsRemaining = 10;
var returnedData = [];
for (var i = 0; i < 10; i++) {
doAjax(whatever, function(response) {
// poignée de succès de l'appel ajax
// enregistrer la réponse
returnedData.push(response);
// voir si nous avons terminé avec le dernier appel ajax
--ajaxCallsRemaining;
if (ajaxCallsRemaining <= 0) {
// toutes les données sont ici maintenant
// parcourir les returnedData et faire tout le traitement
// que vous souhaitez juste ici
}
});
}
Note : la gestion des erreurs est importante ici (non affichée car spécifique à la façon dont vous faites vos appels ajax). Vous devrez réfléchir à la façon dont vous allez gérer le cas où un appel ajax ne se termine jamais, soit avec une erreur, soit reste bloqué pendant longtemps ou dépasse le délai après un certain temps.
jQuery Promesses
Ajout à ma réponse en 2014. De nos jours, les promesses sont souvent utilisées pour résoudre ce type de problème, puisque $.ajax()
de jQuery renvoie déjà une promesse et $.when()
vous permettra de savoir quand un groupe de promesses est résolu 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() {
// les données renvoyées sont dans arguments[0][0], arguments[1][0], ... arguments[9][0]
// vous pouvez les traiter ici
}, function() {
// une erreur s'est produite
});
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 en utilisant la transcompilation babeljs ou en utilisant un polyfill de promesse), alors vous pouvez utiliser les promesses spécifiées par ES6. Voir ce tableau pour la prise en charge par les navigateurs. Les promesses sont prises en charge dans presque tous les navigateurs actuels, sauf IE.
Si doAjax()
renvoie une promesse, vous pouvez faire ceci :
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
// les données renvoyées sont dans arguments[0], arguments[1], ... arguments[n]
// vous pouvez les traiter ici
}, function(err) {
// une erreur s'est produite
});
Si vous avez besoin de transformer une opération asynchrone non promesse en une promesse, vous pouvez la "promisifier" comme ceci :
function doAjax(...) {
return new Promise(function(resolve, reject) {
someAsyncOperation(..., function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
Et ensuite utilisez le schéma ci-dessus :
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
// les données renvoyées sont dans arguments[0], arguments[1], ... arguments[n]
// vous pouvez les traiter ici
}, function(err) {
// une erreur s'est produite
});
Promesses Bluebird
Si vous utilisez une bibliothèque plus complète comme la bibliothèque de promesses Bluebird, alors elle contient quelques fonctions supplémentaires pour simplifier les choses :
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
// tous les résultats ajax sont ici
}, function(err) {
// une erreur quelconque
});