Это leading-edge throttle: первый вызов выполняется сразу, вызовы внутри delay игнорируются, отложенного вызова в конце интервала нет.
Создание функции ограничителя частоты вызовов
Это leading-edge throttle: первый вызов выполняется сразу, вызовы внутри delay игнорируются, отложенного вызова в конце интервала нет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию throttle(fn, delay), которая возвращает обёртку, обеспечивая, что исходная функция fn будет вызываться не чаще, чем один раз за указанный интервал delay миллисекунд. Все вызовы, попадающие в период ограничения, должны игнорироваться.
Ответ
Это leading-edge throttle: первый вызов выполняется сразу, вызовы внутри delay игнорируются, отложенного вызова в конце интервала нет.
В браузерном JavaScript:
function throttle(fn, delay) {
if (typeof fn !== 'function' || !Number.isFinite(delay) || delay < 0) {
throw new TypeError('Invalid throttle arguments');
}
let last = -Infinity;
return function (...args) {
const now = performance.now();
if (now - last < delay) return;
last = now;
return fn.apply(this, args);
};
}
Монотонные часы не зависят от перевода системного времени. Контекст this и аргументы передаются только принятому вызову. Момент фиксируется до fn, поэтому исключение не отменяет период ограничения. Если fn асинхронна, throttle не гарантирует отсутствие перекрытия её незавершённых операций.