Sie waren mit Ihrem Code nicht sehr spezifisch, daher werde ich ein Szenario erstellen. Angenommen, Sie haben 10 Ajax-Anrufe und möchten die Ergebnisse dieser 10 Ajax-Anrufe sammeln. Wenn alle abgeschlossen sind, möchten Sie etwas unternehmen. Sie können dies so tun, indem Sie die Daten in einem Array sammeln und nachverfolgen, wann der letzte fertig ist:
Manueller Zähler
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
}
});
}
Hinweis: Die Fehlerbehandlung ist hier wichtig (wird nicht angezeigt, da sie sich darauf bezieht, wie Sie Ihre Ajax-Anrufe tätigen). Sie sollten sich überlegen, wie Sie mit dem Fall umgehen sollen, wenn ein Ajax-Aufruf nie abgeschlossen wird, entweder mit einem Fehler oder wenn er für eine lange Zeit stecken bleibt oder nach einer langen Zeit eine Zeitüberschreitung aufweist.
jQuery verspricht
Zu meiner Antwort im Jahr 2014 hinzufügen. Heutzutage werden Versprechen häufig verwendet, um diese Art von Problem zu lösen, da jQuery $.ajax()
bereits ein Versprechen zurückgibt und $.when()
Sie darüber informiert, wenn eine Gruppe von Versprechen alle gelöst sind, und die Rückgabeergebnisse für Sie sammelt:
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-Standardversprechen
Wie in der Antwort von kba angegeben : Wenn Sie eine Umgebung mit integrierten nativen Versprechungen haben (moderner Browser oder node.js oder Verwendung von babeljs transpile oder Verwendung einer Versprechen-Polyfüllung), können Sie ES6-spezifizierte Versprechungen verwenden. In dieser Tabelle finden Sie Informationen zur Browserunterstützung. Versprechen werden in nahezu allen aktuellen Browsern mit Ausnahme des IE unterstützt.
Wenn doAjax()
ein Versprechen zurückgegeben wird, können Sie dies tun:
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
});
Wenn Sie eine asynchrone Operation ohne Versprechen in eine Operation verwandeln müssen, die ein Versprechen zurückgibt, können Sie sie wie folgt "versprechen":
function doAjax(...) {
return new Promise(function(resolve, reject) {
someAsyncOperation(..., function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
Und dann verwenden Sie das obige Muster:
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
});
Bluebird verspricht
Wenn Sie eine funktionsreichere Bibliothek wie die Bluebird-Versprechensbibliothek verwenden , sind einige zusätzliche Funktionen integriert, um dies zu vereinfachen:
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
// all ajax results here
}, function(err) {
// some error here
});