Приведённая реализация уже корректна для trailing debounce: она сбрасывает таймер, сохраняет this и аргументы последнего вызова. В примере будет напечатано только 'second'.
Отложенный вызов функции с контролем частоты
Приведённая реализация уже корректна для trailing debounce: она сбрасывает таймер, сохраняет this и аргументы последнего вызова. В примере будет напечатано только 'second'.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию debounce, которая ограничивает частоту вызова переданной функции. При каждом новом запросе таймер сбрасывается, и оригинальная функция будет выполнена только после того, как с момента последнего вызова пройдёт заданный интервал времени. Обёртка должна корректно сохранять контекст (this) и передавать все аргументы оригинальной функции.
function debounce(func, wait) {
let timeoutId = null;
return function(...args) {
const context = this;
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func.apply(context, args), wait);
};
}
Пример использования:
const log = debounce(console.log, 300);
log('first'); // будет отложен
log('second'); // предыдущий таймер сброшен, будет отложен
// После 300 мс после последнего вызова в консоль попадёт 'second'
Ответ
Приведённая реализация уже корректна для trailing debounce: она сбрасывает таймер, сохраняет this и аргументы последнего вызова. В примере будет напечатано только 'second'.
Обычная функция-обёртка получает this вызывающего кода, а стрелка таймера использует сохранённый context. Вызов fetch или func откладывается до паузы длиной wait; при непрерывных обращениях выполнение может не наступить. Это не throttle с регулярной частотой. Для использования в компоненте полезно добавить cancel, очищающий timeoutId при размонтировании. Возвращаемое значение func не становится синхронным результатом обёртки.