Mam tablicę wartości (myarray
), którą chcę iterować i uruchomić żądanie AJAX dla każdej iteracji. Mam umieścić każdy ajax żądania wewnątrz innej tablicy (requests
), tak, że mogę nazwać alert
gdy wszystkie żądania AJAX ukończyli:Zbierz wyniki AJAX w kolejności
tak:
var requests = [];
for (i = 0; i < myarray.length; ++i) {
requests.push($.ajax({
url: 'anotherurl?=' + myarray[i],
dataType: "JSONP",
success: function (data) {
array_of_results.push(data);
}
}));
}
$.when.apply($, requests).done(function() {
alert('complete');
});
Wszystkie wyniki są zebrane w array_of_results
. Jednak z powodu żądań AJAX, które trwają w różnym czasie, tablica ta nie ma wyników w pierwotnej kolejności.
Czy istnieje sposób na zamówienie tej tablicy?
Mam nadzieję, że mam sens. Doceniam to, że jest dość zawiłe.
wywołanie ajax w pętli for. Czy to konieczne ? –
Najlepiej wykonywać tę pracę, wykorzystując obietnice. Takich jak odwzorowanie tablicy w tablicy obietnic (powiedz 'myPromiseArray'), a następnie wywołanie' Promise.all (myPromiseArray) .then (onFulFillment, onReject) 'Gdzie wywołania zwrotne' onFulfillment' i 'onReject 'zostaną dostarczone z tablicą wyniki wywodzące się z obietnic w pierwotnej kolejności. – Redu
Asi rozumie, że wywołanie $ .ajax() zwraca obiekt jqXHR, który od V1.5 przechowuje wszystkie właściwości, metody i zachowanie interfejsu Promise. Więc realizacja tego, o czym wspomniałem w powyższym komentarzu, powinna być błogością. Aby uzyskać więcej informacji na temat tego http://api.jquery.com/jquery.ajax/#jqXHR – Redu