我有这样的代码。循环长度大于 100。
$('.check_box_ping:checked').each(function(i, obj) {
$.post(
"mass_ping.php",
"ping",
function(response) {
}
);
});
现在$.post()
同时发生 100 个呼叫。我想在从服务器$.post()
获得前一个响应后依次执行每个。$.post()
使用 adeferred 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>
脚本.php
<?php
$seconds = rand(2, 5);
sleep($seconds);
header("Content-type: text/html");
echo($seconds);
?>
Sleep()
仅用于模拟响应的随机延迟。在 javascript 控制台上,您应该会看到如下内容:
暂停每个循环的唯一方法是使帖子同步,这通常是一种非常糟糕的用户体验(它会挂起浏览器)。
相反,我建议您重组循环,以便在完成上一篇文章后进行下一次迭代:
(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();
})();
你可以做两件事
post
从您的第一篇文章的返回函数中调用下一个。这将需要在您当前的循环中进行一些更改,但会保持一切顺利运行