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官方文档中阅读更多相关信息:
我写这个解决方案如果有人看到这篇文章可能会有所帮助。
对不起我的英文: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