jQuery请求一个url列表,同时限制最大并发请求数

时间:2012-10-30 17:04:11

标签: javascript jquery ajax performance

  

可能重复:
  Queue AJAX calls

我有一个id列表:

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

我想使用http://xx/ + id请求网址$.getJSON,例如:

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

然而,这会在一段时间内产生太多请求,使浏览器暂停一段时间,所以我的问题是,我怎样才能限制jQuery中并发ajax请求的数量?例如,我发送了10个请求,当他们每个人收到回复时,我发送了另一个请求。

4 个答案:

答案 0 :(得分:1)

当您启动请求时,

shift()pop()数组中的ID。首先解雇10个请求。然后在ajax调用的complete()处理程序中,检查数组长度。如果它大于0,setTimeout几百毫秒(稍微释放浏览器),然后移动或弹出另一个ID并触发另一个请求。

答案 1 :(得分: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 docs:

jQuery.queue
jQuery.dequeue

<强> SO:

What are queues in jQuery?


同时

  

解决方案应该是如何让后端处理多个ID。 - epascarello


##当时有十个请求:有一些问题!

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;

答案 2 :(得分: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();
}

答案 3 :(得分: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();
  });
}