我在循环中有一个jQuery ajax调用。但是我不希望同时进行那些ajax调用,我需要先进行ajax调用才能完成下一步。
for (var i = 0; i < options.length; i++) {
jQuery.ajax({
url: "ajax_file.php",
data: //some data based on DOM tree
success: function(data){
//some DOM manipulation
}
});
}
我希望循环只在执行SUCCESS中的DOM操作后继续执行(因为ajax调用依赖于DOM树)。 从理论上讲,我知道我可以将ajax调用设置为async:false,但不建议这样做,因为它可以冻结浏览器。
答案 0 :(得分:7)
因为async: false
总是一个坏主意,我建议这样的事情:
var recur_loop = function(i) {
var num = i || 0; // uses i if it's set, otherwise uses 0
if(num < options.length) {
jQuery.ajax({
url: "ajax_file.php",
data: //some data based on DOM tree
success: function(data){
recur_loop(num+1);
}
});
}
};
答案 1 :(得分:1)
你可以做这样的事情(伪代码):
var i =0;
doLoop();
function doLoop() {
//exit condition
if (i >= options.length) {
return;
}
//loop body- call ajax
$.ajax({
//...
success: function(data) {
//do your thing
i++;
//go to next iteration of the loop
doLoop();
}
});
}
答案 2 :(得分:1)
将async
设置为false即可。请记住,如果您以异步方式执行请求,Web浏览器可能会锁定。
jQuery.ajax({
async : false,
url: "ajax_file.php",
data: //some data based on DOM tree
success: function(data){
//some DOM manipulation
}
});