jquery: дождитесь окончания всех вызовов ajax и продолжайте
У меня есть несколько вызовов ajax в моем документе.ready()
лайк:
for (j=1; j <= 7; j++){
(function(index) {
$.getJSON('my.php', {id:index},
function(data) {
$.each(data, function(index2, array){
........
});
});
})(j)
}
//DO NOT CONTINUE UNTIL FINISH AJAX CALLS
........
MORE JQUERY CODE
Как я могу заставить его ждать и не продолжать, пока мы не получим все обратные вызовы от запросов ajax?
5 ответов
Мне вообще не нравится какой-либо ответ, лучший способ (начиная с Jquery 1.5+) - использовать отложенные объекты, это объекты для манипулирования асинхронными вызовами, которые вы можете решить:
$.when($.ajax("/page1.php"), $.ajax("/page2.php"))
.then(myFunc, myFailure);
Таким образом, myFunc выполняется после двух вызовов ajax и myFailure, если любой из них имеет ошибку.
Вы можете прочитать больше об этом в официальной документации jquery: JQuery Deferred Object
Я пишу это решение, если кто-нибудь увидит этот пост, это может быть полезно.
Извините мой английский:P
Во-первых, вы можете рассмотреть возможность выполнения кода запуска в одном вызове.
Второе: вместо ожидания просто вызовите другой вызов функции. для приведенного выше кода это должно выглядеть примерно так:
for (j=1; j <= 7; j++){
(function(index) {
$.getJSON('my.php', {id:index},
function(data) {
$.each(data, function(index2, array){
........
});
if (j === 7) {
initDoneDoMoreStuff()
}
});
})(j)
}
или триггер:
for (j=1; j <= 7; j++){
(function(index) {
$.getJSON('my.php', {id:index},
function(data) {
$.each(data, function(index2, array){
........
});
if (j === 7) {
$(document).trigger("initdone");
}
});
})(j)
}
$(document).bind("initdone", function() {....});
Мне было нелегко сделать это, но, возможно, вы найдете мой код полезным. Это процесс отправки всех форм в DOM и после того, как все они сохранены, перенаправить пользователя на другую страницу.
formulario = $('form');
formulariolongitud = formulario.length;
i = 0;
formulario.each(function(index, value) {
$(this).ajaxSubmit({
async: false,//not sure i
success: function() {
i++;
if(i === formulario.length) {//this is the last one to submit
window.location.replace(whatever);
}
}
});
});
Вы можете использовать sucess (т.е. функцию обратного вызова ajax jquery), как показано ниже:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: function(data){
//Write your code here.
}
});
Вы можете получить документацию AJAX ниже -
Проблема с чем-то вроде if (j == 7) заключается в ситуации, когда 7-й запрос очень быстрый, и даже один из других - медленный. Даже если вы поставили его в очередь последним, он может оказаться не последним.
Этот ответ, кажется, работает для всех условий: /questions/26774961/podozhdite-poka-vse-zaprosyi-jquery-ajax-budut-vyipolnenyi/26774981#26774981