5

重複の可能性:
AJAX 呼び出しをキューに入れる

IDのリストがあります:

var ids = [3738, 75995, 927, ... ]; // length is about 2000

http://xx/ + id次のように URLをリクエストしたいと思い$.getJSONます。

ids.forEach(function(id, index){
    $.getJSON('http://xx/' + id, function(data){
        // store the data in another array.
    });
});

ただし、これは一度に大量のリクエストを行い、ブラウザがしばらくブロックされるため、私の質問は、jQuery で同時 ajax リクエストの数を制限するにはどうすればよいですか? たとえば、10 個のリクエストを送信し、それぞれが応答を取得したら、別のリクエストを送信します。

4

4 に答える 4

1

shift()またはpop()、リクエストを開始するときに配列からIDを削除します。10個のリクエストを実行することから始めます。次に、complete()ajax呼び出しのハンドラーで、配列の長さを確認します。0より大きい場合setTimeoutは、数百ミリ秒(ブラウザーを少し解放するため)、次に別のIDをシフトまたはポップオフして、別の要求を実行します。

于 2012-10-30T17:21:47.110 に答える
1
var $queue = $({});

ids.forEach(function(id, index) {
    $queue.queue("ajaxQueue", function( next ) {
        $.getJSON('http://xx/' + id, function(data){
            // store the data in another array.

            next();
        });
    });
});

$queue.queue("ajaxQueue", function() {
    // everything is saved
});

$queue.dequeue("ajaxQueue");

jQuery ドキュメント:

jQuery.queue
jQuery.dequeue

それで:

jQueryのキューとは?


また:

解決策は、バックエンドで複数の ID を処理する方法です。–エパスカレロ


##一度に 10 件のリクエスト:いくつか問題があります。

var $queue = $({}),
    handler;

ids.forEach(function(id, index) {
    if ( !(index % 10) && handler ) {
         $queue.queue("ajaxQueue", handler);
    }
    handler = (function(prev) {
        return function( next ) {
            prev();
            $.getJSON('http://xx/' + id, function(data){
                // store the data in another array.
            });
            if ( next ) {
                next();
            }
        }
    })(handler);
});

$queue.queue("ajaxQueue", function() {
    // everything is saved
});

$queue.dequeue("ajaxQueue");

x % y

(index % 10) => Math.floor(index/10)*10 === index;
!(index % 10) => Math.floor(index/10)*10 !== index;
于 2012-10-30T17:28:51.420 に答える
0
var cnt = 0;
function getEach() {
    if (cnt>=ids.length) return;
    $.getJSON('http://xx/' + ids[cnt], function(data){
    // store the data in another array.
    cnt++;
    getEach(); 
    // or setTimeout(getEach,1000); to wait a sec
    // or if (cnt%10==0) setTimeout(getEach,1000); to wait a sec every 10
    //    else getEach();
  });
}
于 2012-10-30T17:15:09.007 に答える
0

これでうまくいくはずです:

var current;    

function fetchCurrentLast()
{
    if (current < ids.length)
    {
        var id = ids[current];
        current++;

        $.getJSON('http://xx/' + id, function(data){
            // store the data in another array.

            fetchCurrentLast();
        });
    }
}

current = 0;

for (var i = 0; i < 10; i++)
{
    fetchCurrentLast();
}
于 2012-10-30T17:14:18.790 に答える