Работали ли вы с Debounce?

«Работали ли вы с Debounce?» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно использовал debounce в Node.js, особенно в серверных приложениях для оптимизации обработки частых событий или запросов. Например, для обработки логов, агрегации метрик или ограничения вызовов к внешним API.

Реализация на чистом JavaScript для Node.js:

function debounce(func, wait, immediate = false) {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      timeout = null;
      if (!immediate) func.apply(this, args);
    };
    const callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(this, args);
  };
}

// Пример: Дебаунс записи аудита действий пользователя
const auditLogQueue = [];
const debouncedFlushLog = debounce(async () => {
  await LogModel.insertMany(auditLogQueue);
  auditLogQueue.length = 0; // Очищаем массив
}, 1000); // Сбрасываем логи в БД раз в секунду при активности

app.post('/api/action', (req, res) => {
  auditLogQueue.push({ userId: req.user.id, action: req.body.action });
  debouncedFlushLog(); // Вызовется один раз после серии быстрых действий
  res.sendStatus(200);
});

Эта техника критически важна для предотвращения "шторма" запросов к базе данных или внешним сервисам, что повышает стабильность и производительность приложения.