Ограничение jQuery Количество одновременных запросов AJAX
поэтому у меня есть серия событий AJAX, которые я хотел бы запустить, но я хочу ограничить количество одновременных запросов до 5 и поставить в очередь остальные. Так, например, у меня есть следующее:
$("div.server").each(function() {
$.ajax(....);
});
Таким образом, может быть 100 div с классом server
, но я хочу только запустить 5 запросов в любой момент времени. По завершении запроса он должен перейти к следующему.
Каков наилучший способ сделать это?
Ответы
Ответ 1
Лучший способ сделать это - позволить браузеру справиться с этим. Обычно у браузеров уже есть ограничение на соединение для каждого хоста, поэтому они будут автоматически очереди на соединения, если их слишком много.
Однако я бы подумал об изменении API, чтобы он учитывал дату из нескольких элементов, а также возвращал данные для нескольких элементов, т.е. уменьшал общий счет HTTP-запросов.
Ответ 2
Вставьте все аргументы запроса в очередь с помощью функции queueRequest
и вызовите checkQueue
. checkQueue
проверяет, есть ли элементы в очереди и количество активных запросов меньше 5. Если эти условия выполнены, он выдает запрос из очереди и превращает его в настоящий запрос AJAX. Затем он прикрепляет обработчик done
к запросу, который уменьшает количество активных запросов и вызывает checkQueue
.
Ответ 3
Если вы все еще не уверены в возможностях браузера в очереди запросов, вы можете попробовать что-то вроде этого:
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);
});
});
});
Возможно, вам придется настроить его для своих нужд.