Ich benutze jQuery und habe eine Schleife von asynchronen AJAX-Anfragen. Ich weiß, dass ich auf sie alle warten kann, bis sie fertig sind, indem ich die praktische Methode '$.when.apply(array_of_requests).then()' benutze.
Aber ich habe auch eine weitere Gruppe von AJAX-Anfragen, die nur ausgeführt werden, nachdem jede der ersten Anfragen abgeschlossen ist. Ich möchte auch auf sie warten, bin mir aber nicht zu 100% sicher, ob ich den besten Weg gefunden habe.
Hier ist ein vereinfachtes Beispiel meiner Anfragen:
var intital_data = [1,2,3,4,5,6,7,8,9,10];
var promises = [];
var promises_inner = [];
$.each(intitial_data, function(i, n) {
var ajax_call = $.ajax({url:'http://www.domain.com/etc/'+n});
promises.push(ajax_call);
ajax_call.done(function(data) {
var ajax_call_inner = $.ajax({url:'http://www.domain.com/etc/'+data.result});
promises_inner.push(ajax_call_inner);
ajax_call_inner.done(function(data) {
// Hier wird etwas mit dem Inhalt von data gemacht.
});
});
});
Also, wenn jede der zehn durchgeführten AJAX-Anfragen abgeschlossen ist, mache ich eine zweite AJAX-Anfrage basierend auf den Ergebnissen der ersten. Das funktioniert alles gut.
Dann habe ich etwas wie das hier, weil ich warten möchte, bis sowohl die ersten zehn Anfragen (gespeichert im promises-Array) als auch die zweite Gruppe (gespeichert in promises_inner) abgeschlossen sind:
$.when.apply($, promises).then(
function() {
// Die zehn äußeren AJAX-Aufrufe sind jetzt abgeschlossen.
$.when.apply($, promises_inner).then(
function() {
// Die inneren AJAX-Aufrufe sind jetzt abgeschlossen.
}
);
}
);
Innerhalb der 'done'-Funktion des ersten $.when.apply().then() sind die zweiten Anfragen noch nicht abgeschlossen oder sogar dem promises_inner-Array hinzugefügt worden. Aber ich fand heraus, dass das Hinzufügen einer verschachtelten $.when.apply().then() zu funktionieren scheint - innerhalb seiner 'done'-Funktion sind alle Anfragen abgeschlossen.
Aber ich bin mir nicht sicher, ob das die beste und zuverlässigste Lösung ist. Ich mache mir Sorgen, dass es nur zufällig funktioniert - dass es gerade genug Verzögerung verursacht, damit die Aufrufe abgeschlossen sind - anstatt logischen Sinn zu ergeben.
Gibt es eine bessere, robuster Lösung? Danke.