Функция throttle ограничивает частоту выполнения callback-функции в пределах заданного временного интервала. Она поддерживает два настраиваемых края:
function throttle(fn, limit, options = { leading: true, trailing: true })
fn – функция, которую нужно ограничитьlimit – длительность интервала в миллисекундахoptions – управляет поведением leading/trailingfunction throttle(fn, limit, options = { leading: true, trailing: true }) {
let lastCall = 0, timer = null;
return function (...args) {
const now = Date.now();
if (!lastCall && !options.leading) lastCall = now;
const remaining = limit - (now - lastCall);
if (remaining <= 0) {
clearTimeout(timer);
timer = null;
lastCall = now;
fn.apply(this, args);
} else if (!timer && options.trailing) {
timer = setTimeout(() => {
lastCall = options.leading ? Date.now() : 0;
timer = null;
fn.apply(this, args);
}, remaining);
}
};
}
lastCall отслеживает временну́ю метку последнего выполненияremaining вычисляет, сколько времени осталось в текущем интервалеremaining <= 0, окно throttle истекло — выполнить немедленно и сбросить таймерremaining > 0 и trailing включён, запланировать отложенный вызов через setTimeoutlastCall устанавливается в now при первом вызове, чтобы пропустить немедленное выполнениеleading: false задерживает первое выполнение до истечения интервалаtrailing: false игнорирует вызовы, сделанные во время активного окна throttlefn.apply(this, args) сохраняет правильный контекст вызова и аргументыКогда leading: true и trailing: true, функция throttle будет всегда выполняться при первом вызове, а затем снова после истечения интервала, если были сделаны дополнительные вызовы.
Новый — ещё не проверен сообществом
Вы