Сохраняйте один ID таймера. Каждый onChange отменяет прежний вызов и планирует fetchData с последним значением через 1000 мс тишины.
Отложенный вызов функции (debounce)
Сохраняйте один ID таймера. Каждый onChange отменяет прежний вызов и планирует fetchData с последним значением через 1000 мс тишины.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Текстовый поиск, имитирующий работу с бекендом. Мы реагируем на каждую вводимую букву, однако запрос к серверу (функция fetchData) должен отправляться только после паузы ввода не менее 1 секунды.
- Нельзя использовать сторонние библиотеки, всё реализуется на чистом JavaScript.
- Не требуется создавать HTML‑форму, достаточно обработать условный вызов onChange(value).
- Не использовать React и связанные с ним окружения.
// пример сигнатуры функции, которую нужно вызвать после паузы
function fetchData(query) {
// имитация обращения к API
console.log('Запрос к API с параметром:', query);
}
Ответ
Сохраняйте один ID таймера. Каждый onChange отменяет прежний вызов и планирует fetchData с последним значением через 1000 мс тишины.
let timer;
function onChange(value) {
clearTimeout(timer);
timer = setTimeout(() => {
timer = undefined;
fetchData(value);
}, 1000);
}
HTML и React не нужны. Таймер закрывает именно value текущего вызова; отменённые таймеры не выполняются. При непрерывном вводе запрос откладывается неограниченно — это debounce, не throttle. Уже отправленный запрос clearTimeout не отменяет; если он настоящий, для защиты от устаревших ответов нужен отдельный AbortController или номер запроса.