Hier ist ein Rückrufobjekt, das ich geschrieben habe, in dem Sie entweder einen einzelnen Rückruf so einstellen können, dass er ausgelöst wird, sobald alle abgeschlossen sind, oder dass jeder seinen eigenen Rückruf hat und alle einmal abgeschlossen wird:
BEACHTEN
Seit jQuery 1.5+ können Sie die verzögerte Methode wie in einer anderen Antwort beschrieben verwenden:
$.when($.ajax(), [...]).then(function(results){},[...]);
Beispiel hier aufgeschoben
Für jQuery <1.5 funktioniert Folgendes oder wenn Sie Ihre Ajax-Anrufe zu unbekannten Zeiten abfeuern müssen, wie hier gezeigt, mit zwei Schaltflächen: Wird ausgelöst, nachdem beide Schaltflächen angeklickt wurden
[Verwendung]
für einen einzelnen Rückruf nach Abschluss: Arbeitsbeispiel
// initialize here
var requestCallback = new MyRequestsCompleted({
numRequest: 3,
singleCallback: function(){
alert( "I'm the callback");
}
});
//usage in request
$.ajax({
url: '/echo/html/',
success: function(data) {
requestCallback.requestComplete(true);
}
});
$.ajax({
url: '/echo/html/',
success: function(data) {
requestCallback.requestComplete(true);
}
});
$.ajax({
url: '/echo/html/',
success: function(data) {
requestCallback.requestComplete(true);
}
});
Jeder hat seinen eigenen Rückruf, wenn alle abgeschlossen sind: Arbeitsbeispiel
//initialize
var requestCallback = new MyRequestsCompleted({
numRequest: 3
});
//usage in request
$.ajax({
url: '/echo/html/',
success: function(data) {
requestCallback.addCallbackToQueue(true, function() {
alert('Im the first callback');
});
}
});
$.ajax({
url: '/echo/html/',
success: function(data) {
requestCallback.addCallbackToQueue(true, function() {
alert('Im the second callback');
});
}
});
$.ajax({
url: '/echo/html/',
success: function(data) {
requestCallback.addCallbackToQueue(true, function() {
alert('Im the third callback');
});
}
});
[Der Code]
var MyRequestsCompleted = (function() {
var numRequestToComplete, requestsCompleted, callBacks, singleCallBack;
return function(options) {
if (!options) options = {};
numRequestToComplete = options.numRequest || 0;
requestsCompleted = options.requestsCompleted || 0;
callBacks = [];
var fireCallbacks = function() {
alert("we're all complete");
for (var i = 0; i < callBacks.length; i++) callBacks[i]();
};
if (options.singleCallback) callBacks.push(options.singleCallback);
this.addCallbackToQueue = function(isComplete, callback) {
if (isComplete) requestsCompleted++;
if (callback) callBacks.push(callback);
if (requestsCompleted == numRequestToComplete) fireCallbacks();
};
this.requestComplete = function(isComplete) {
if (isComplete) requestsCompleted++;
if (requestsCompleted == numRequestToComplete) fireCallbacks();
};
this.setCallback = function(callback) {
callBacks.push(callBack);
};
};
})();