在FOR循环中等待以前的AJAX调用
问题描述:
在循环和执行下一个调用之前,我将如何等待以前的ajax调用完成?目前代码一直循环并一次执行所有ajax请求!在FOR循环中等待以前的AJAX调用
<script>
var busy;
function check(mailpass, proxy){
var post_data = {};
var post_json = "";
post_data['mailpass'] = mailpass;
post_data['proxy'] = '108.36.248.67:17786';
post_json = JSON.stringify(post_data);
jQuery.ajax({
url: '/postdata' ,
type: "POST",
data: {params: post_json},
success: function(data){
var obj = JSON.parse(data);
if(obj.error == 0){
//
$("#acc-live").append(obj.msg + "<br/>");
} else if(obj.error == 1){
//
$("#socks-die").append(obj.msg+ "<br/>");
} else if(obj.error == 2){
//
$("#acc-die").append(obj.msg+ "<br/>");
}
}
});
}
$(document).ready(function(){
$("#submit").click(function(){
var lines = $("#lines").val().split('\n');
for(var i = 0;i < lines.length;i++){
check(lines[i], '123');
}
});
});
</script>
答
你可以添加计数器(CURRENTINDEX)和重有点组织代码。
var busy;
var lines;
var currentIndex = 0;
function checkNext(){
if(currentIndex >= lines.length){
console.log('all done');
return;
}
var mailpass = lines[currentIndex];
var proxy = '123';
var post_data = {};
var post_json = "";
post_data['mailpass'] = mailpass;
post_data['proxy'] = '108.36.248.67:17786';
post_json = JSON.stringify(post_data);
jQuery.ajax({
url: '/postdata' ,
type: "POST",
data: {params: post_json},
success: function(data){
var obj = JSON.parse(data);
if(obj.error == 0){
//
$("#acc-live").append(obj.msg + "<br/>");
} else if(obj.error == 1){
//
$("#socks-die").append(obj.msg+ "<br/>");
} else if(obj.error == 2){
//
$("#acc-die").append(obj.msg+ "<br/>");
}
currentIndex++; //Increase the counter
checkNext();
}
});
}
$(document).ready(function(){
$("#submit").click(function(){
lines = $("#lines").val().split('\n');
checkNext();
});
});
答
只要有它,这样你的函数一旦AJAX请求已成功完成check
返回一个回调函数,这样一旦与AJAX请求完成它只会再次启动循环。
function check(mailpass, proxy, callback) { //Callback function passed as a parameter
...
success: function(data){
...
callback(); //Invokes the function to start the loop again...
}
}
然后当你打电话给你重复它的功能...
i = 0;
var lines = $("#lines").val().split('\n');
var loop = function checkLines()
i++
if (i < lines.length) {
check(lines[i], '123', function() {
loop(); //Calls the function to loop again, checking to see if `i` is less than `lines`...
});
}
}
答
如果你只是想等待完成Ajax调用为什么你不能只让async : false
? (虽然我不建议这样)
jQuery.ajax({
url: '/postdata' ,
type: "POST",
async : false, // here
data: {params: post_json},
success: function(data){
var obj = JSON.parse(data);
if(obj.error == 0){
//
$("#acc-live").append(obj.msg + "<br/>");
} else if(obj.error == 1){
//
$("#socks-die").append(obj.msg+ "<br/>");
} else if(obj.error == 2){
//
$("#acc-die").append(obj.msg+ "<br/>");
}
}
});
,将使循环等待,直到方法完成其执行