如何在响应进入jquery之前停止循环?

时间:2013-01-09 12:55:49

标签: ajax jquery

我有这样的代码。循环长度大于100。

$('.check_box_ping:checked').each(function(i, obj) {
    $.post(
        "mass_ping.php",
        "ping", 
        function(response) {
        }
    );
});

现在100个$.post()次呼叫同时发生。我想从服务器获取前一个$.post()的响应后,依次执行每个$.post()

3 个答案:

答案 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控制台上,您应该看到如下内容:

output

答案 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)

你可以做两件事

  1. 更改您的代码,以便从第一篇文章的return函数中调用下一个post。这需要对当前循环进行一些更改,但会保证一切顺利运行
  2. 更快,但更脏,是让帖子同步。您可以在这个问题中找到问题:how to make a jquery "$.post" request synchronous。我建议不要这样做,因为它会在加载过程中削弱你的页面。