Подтвердить что ты не робот

Ограничение jQuery Количество одновременных запросов AJAX

поэтому у меня есть серия событий AJAX, которые я хотел бы запустить, но я хочу ограничить количество одновременных запросов до 5 и поставить в очередь остальные. Так, например, у меня есть следующее:

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

Таким образом, может быть 100 div с классом server, но я хочу только запустить 5 запросов в любой момент времени. По завершении запроса он должен перейти к следующему.

Каков наилучший способ сделать это?

4b9b3361

Ответ 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);
         });
     });
});

Возможно, вам придется настроить его для своих нужд.