我有这样的代码。循环长度大于100。
$('.check_box_ping:checked').each(function(i, obj) {
$.post(
"mass_ping.php",
"ping",
function(response) {
}
);
});
现在100个$.post()
次呼叫同时发生。我想从服务器获取前一个$.post()
的响应后,依次执行每个$.post()
。
答案 0 :(得分:6)
使用deferred object
,您可以链接所有ajax调用,在一些链式pipe()
方法中返回一个promise(请参阅下面的控制台输出)
标记和js
<body>
<input type="checkbox" checked />
<input type="checkbox" checked />
<input type="checkbox" checked />
<input type="checkbox" checked />
</body>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>
function doRequest() {
return $.post("script.php").done(function(response) {
console.log('Loaded in %d seconds', response);
});
}
$(document).ready(function(){
var dfd = $.Deferred(),
chain = dfd;
$('input:checked').each(function() {
chain = chain.pipe(function() {
return doRequest().promise();
});
});
chain.done(function() {
console.log('done')
});
return dfd.resolve();
});
</script>
<强>的script.php 强>
<?php
$seconds = rand(2, 5);
sleep($seconds);
header("Content-type: text/html");
echo($seconds);
?>
Sleep()
仅用于模拟响应的随机延迟。在javascript控制台上,您应该看到如下内容:
答案 1 :(得分:2)
暂停每个循环的唯一方法是使帖子同步,这通常是非常糟糕的用户体验(它会挂起浏览器)。
我建议您重新构建循环,以便从上一篇文章的完成开始进行下一次迭代:
(function() {
var checked = $('.check_box_ping:checked');
var index = 0;
function next() {
if (index < checked.length ) {
var item = checked.eq(index++);
// use item here for your post
$.post({...}, function(response) {
// do your normal handling of the response here
...
// now kick off the next iteration of the loop
next();
});
}
}
next();
})();
答案 2 :(得分:1)
你可以做两件事
post
。这需要对当前循环进行一些更改,但会保证一切顺利运行