所以我有一系列 AJAX 事件想要触发,但我想将并发请求的数量限制为 5,并将其余的请求数排队。例如,我有以下内容:
$("div.server").each(function() {
$.ajax(....);
});
所以类server
可能有 100 个div,但我只想在任何给定时间运行 5 个请求。请求完成后,应继续执行下一个请求。
最好的方法是什么?
最好的方法是让浏览器处理它。通常,浏览器已经有每个主机的连接限制,因此如果连接太多,它们将自动排队。
但是,我会考虑更改 API,以便它从多个元素获取日期并返回多个元素的数据 - 即减少必要的 HTTP 请求总数。
使用名为 queueRequest
的函数将所有请求参数推送到队列并调用 checkQueue
。 checkQueue
检查队列中是否有项目,以及活动请求数是否小于 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);
});
});
});
您可能需要根据需要对其进行调整。