Отложенный вызов функции с контролем частоты

Приведённая реализация уже корректна для 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 не становится синхронным результатом обёртки.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее