вторник, 30 июля 2013 г.

Предложите общее решение, позволяющее вызывать любую функцию не чаще N раз в секунду, даже если её вызов происходит чаще.

Мы уделяем большое внимание производительности наших приложений. Нередко случается, что отдельно взятая функция (например, обработчик события) работает достаточно долго, а вызывается часто, что сильно ухудшает отзывчивость интерфейса.

Предложите общее решение, позволяющее вызывать любую функцию не чаще N раз в секунду, даже если её вызов происходит чаще.

Решение.

Вариант 1.

Вызов функции 1 раз в несколько секунд.

function delayBeforeNextCall (func, delayTime) {
    var isFunctionReadyForNextCall = true;
    return function () {
        if (isFunctionReadyForNextCall) {
            isFunctionReadyForNextCall = false;
            func();
            setTimeout(function(){
                isFunctionReadyForNextCall = true;
            }, delayTime);
        }
    }
}

var frequentFunction = function () {
    console.log('OK');
}

frequentFunction = delayBeforeNextCall(frequentFunction, 5000);

document.body.onclick = frequentFunction;


Вариант 2.

Вызов функции N раз в несколько секунд.

function delayBeforeNextCall (func, delayTime, maxNumberOfCalls) {
    var isFunctionReadyForNextCall = true;
    var numberOfCalls = 0;
    return function () {
        if (isFunctionReadyForNextCall) {
            if (numberOfCalls < maxNumberOfCalls) {
                numberOfCalls++;
                func();
            } else {
                isFunctionReadyForNextCall = false;
                numberOfCalls = 0;
                setTimeout(function(){
                    isFunctionReadyForNextCall = true;
                }, delayTime);
            }
        }
    }
}

var frequentFunction = function () {
    console.log('OK');
}

frequentFunction = delayBeforeNextCall(frequentFunction, 5000, 5);

document.body.onclick = frequentFunction;

Комментариев нет:

Отправить комментарий