0

私はこのようなコードを持っています。ループの長さが100より大きくなっています。

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

現在、100回の$.post()呼び出しが同時に発生します。$.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>

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

あなたは2つのことをすることができます

  1. postコードを変更して、最初の投稿のreturn関数からnextを呼び出すようにします。これには現在のループを変更する必要がありますが、すべてがスムーズに実行され続けます
  2. より速く、しかし汚いのは、ポストを同期させることです。この質問でその方法を見つけることができます:jquery"$.post"リクエストを同期させる方法。ロード中にページが機能しなくなるため、これに反対することをお勧めします。
于 2013-01-09T12:57:56.427 に答える