0

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

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

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

4

3 回答 3

6

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

输出

于 2013-01-09T13:16:14.227 回答
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();

})();
于 2013-01-09T13:20:34.793 回答
1

你可以做两件事

  1. 更改您的代码,以便post从您的第一篇文章的返回函数中调用下一个。这将需要在您当前的循环中进行一些更改,但会保持一切顺利运行
  2. 更快,但很脏,是使帖子同步。您可以在这个问题中了解如何:如何使 jquery "$.post" 请求同步。我建议不要这样做,因为它会在加载期间削弱您的页面。
于 2013-01-09T12:57:56.427 回答