关于javascript:jquery:等到所有ajax调用完成然后继续

jquery : wait until all ajax calls finish then continue

本问题已经有最佳答案,请猛点这里访问。

我的文档中有一些ajax调用.ready()

喜欢 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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请求得到所有回调?


我根本不喜欢任何答案,最好的方法(因为Jquery 1.5+)是使用Deferred对象,那些是操作异步调用的对象,你可以解决:

1
2
$.when($.ajax("/page1.php"), $.ajax("/page2.php"))
  .then(myFunc, myFailure);

这样,myFunc在进行2次ajax调用后执行,而myFailure如果有任何一次出错则执行。

您可以在jquery官方文档中阅读更多相关信息:JQuery Deferred Object

我写这个解决方案如果有人看到这篇文章可能会有所帮助。

对不起我的英文:P


首先,您可能需要考虑在一次调用中执行启动代码。
第二:而不是等待只是调用另一个函数调用。对于上面的代码,它应该看起来像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)
}

或触发:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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中提交所有表单的过程,在存储完所有表单后,将用户重定向到另一个页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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的回调函数),如下所示:

1
2
3
4
5
6
7
8
$.ajax({
  url: url,
 dataType: 'json',
 data: data,
 success: function(data){
 //Write your code here.
    }
});

你可以在下面获得ajax的文档 -

阿贾克斯


像if(j == 7)这样的问题是第7个请求非常快的情况,甚至其中一个请求很慢。即使你最后排队,也可能不是最后完成的。

这个答案似乎适用于所有条件:
https://stackoverflow.com/a/3709809/813154