Как оценить лимит ajax-запросов?

Существует несколько div и обработчиков для отправки ajax-запросов при их нажатии. Моя проблема в том, что я не знаю, как заставить моего обработчика не превышать предел 1 запроса за 30 секунд.

Цените свою помощь!

Ответы

Ответ 1

Отличная Underscore.js имеет функцию дроссельной заслонки. Вы передаете обработчик, который вы хотите активировать, и верните ограниченную скоростью версию той же функции.

var throttled = _.throttle(someHandler, 100);
$(div).click(throttled);

http://documentcloud.github.com/underscore/#throttle

Вот упрощенная версия, которую я использовал в своем собственном коде:

function throttle(func, wait) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        if (!timeout) {
            // the first time the event fires, we setup a timer, which 
            // is used as a guard to block subsequent calls; once the 
            // timer handler fires, we reset it and create a new one
            timeout = setTimeout(function() {
                timeout = null;
                func.apply(context, args);
            }, wait);
        }
    }
}

Хороший способ проверить это, выпустив кучу событий прокрутки и просмотрев журнал обработчиков в консоли Firebug:

document.addEventListener("scroll", throttle(function() {
    console.log("test");
}, 2000), false); 

Здесь версия, которая ограничивает события click на событиях div каждые 30 секунд, по запросу (требуется jQuery):

$("div").click(throttle(function() {
    // ajax here
}, 30000));

Ответ 2

Если вы хотите ограничить скорость, то, к сожалению, метод _.throttle, который предоставляет underscore.js, не является вашим решением. Throttle просто гарантирует, что ваш метод никогда не будет вызван дольше, чем на X секунд, и поэтому все последующие вызовы функций будут игнорироваться до тех пор, пока не пройдет этот период.

Если вы хотите ограничить скорость, чтобы никогда не вызывать свою функцию более X раз в секунду, но при этом не теряете эти вызовы функций, вам нужно совершенно другое решение.

Я написал расширение для подчеркивания в https://gist.github.com/1084831

Вы можете увидеть рабочий пример на http://jsbin.com/upadif/8/edit#preview

Ответ 3

Создайте флаг boolean canFireRequest или что-то еще, и установите его в false после каждого запроса ajax. Затем создайте 30-секундный временной интервал, который вернет его к true; проверьте значение флага перед каждым новым запросом.

Вот пример:

if ($(this).data('canFireRequest')) {
    // Ajax request goes here
    $(this).data('canFireRequest', false);
}

setTimeout(function() {
    $(this).data('canFireRequest', true)
}, 30000);