Мы уделяем большое внимание производительности наших приложений. Нередко случается, что отдельно взятая функция (например, обработчик события) работает достаточно долго, а вызывается часто, что сильно ухудшает отзывчивость интерфейса.
Предложите общее решение, позволяющее вызывать любую функцию не чаще 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;
Комментариев нет:
Отправить комментарий