我的document.ready()
中有一些ajax调用喜欢:
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请求中获得所有回调,我怎么能强迫它等待而不是继续?
答案 0 :(得分:16)
我根本不喜欢任何答案,最好的方法(因为Jquery 1.5+)是使用Deferred对象,那些是操纵异步调用的对象,你可以解决:
$.when($.ajax("/page1.php"), $.ajax("/page2.php"))
.then(myFunc, myFailure);
这样,myFunc在进行2次ajax调用后执行,而myFailure如果其中任何一次调用都有错误。
您可以在jquery官方文档中了解更多相关信息:JQuery Deferred Object
我写这个解决方案,如果有人看到这篇文章可能会有所帮助。
对不起我的英文:P
答案 1 :(得分:6)
首先,您可能需要考虑在一次通话中执行启动代码 第二:而不是等待只是调用另一个函数调用。对于上面的代码,它应该看起来像:
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() {....});
答案 2 :(得分:3)
我这样做并不容易,但也许你发现我的代码很有用。这是一个在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);
}
}
});
});
答案 3 :(得分:1)
你可以使用sucess(即ajax jquery的回调函数),如下所示:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: function(data){
//Write your code here.
}
});
您可以在下面获取ajax的文档 -
答案 4 :(得分:0)
if(j == 7)之类的问题是当第7个请求非常快时,甚至其中一个请求很慢的情况。即使你最后排队,也可能不是最后完成的。
这个答案似乎适用于所有条件: https://stackoverflow.com/a/3709809/813154