jQuery 限制并发 AJAX 请求的数量



所以我有一系列 AJAX 事件想要触发,但我想将并发请求的数量限制为 5,并将其余的请求数排队。例如,我有以下内容:

 $("div.server").each(function() {
     $.ajax(....);
 });

所以类server可能有 100 个div,但我只想在任何给定时间运行 5 个请求。请求完成后,应继续执行下一个请求。

最好的方法是什么?

最好的方法是让浏览器处理它。通常,浏览器已经有每个主机的连接限制,因此如果连接太多,它们将自动排队。

但是,我会考虑更改 API,以便它从多个元素获取日期并返回多个元素的数据 - 即减少必要的 HTTP 请求总数。

使用名为 queueRequest 的函数将所有请求参数推送到队列并调用 checkQueuecheckQueue检查队列中是否有项目,以及活动请求数是否小于 5。如果满足这些条件,它会从队列中弹出一个请求,并将其转换为真正的 AJAX 请求。然后,它将done处理程序附加到请求,以减少活动请求计数并调用checkQueue

如果仍然不确定浏览器对请求进行排队的功能,您可以尝试如下操作:

var count = 0;          // Number of functions being called
var funcArray = [];     // Array of functions waiting
var MAX_REQUESTS = 5;   // Max requests
var CALL_WAIT = 100;        // 100ms
function call()
{
    // Check if count doesn't exceeds or if there aren't any functions to call
    if(count >= MAX_REQUESTS || funcArray.length == 0)
        // Call call() after 100ms
        setTimeout(function() { call() }, CALL_WAIT);
    count++;            // Add request to the counter
    var func = funcArray.pop();
    $.ajax(..., function(data)
    {
        func(data);
        // .......
        count--;        // Substract request to the counter
    });
}
$(function()
{
    call();     // First call to start polling. It will call itself each 100ms
});
$(function()
{
    $("div.server").each(function() {
         funcArray.push(function(data)
         {
            alert(data);
         });
     });
});

您可能需要根据需要对其进行调整。

最新更新