> Как обрабатывать превышение лимита вызовов функции в JavaScript и что возвращать (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
Для обработки превышения лимита вызовов функции в JavaScript можно использовать debouncing (устранение дребезга) или throttling (троттлинг). Выбор зависит от сценария:
- Debouncing - откладывает вызов до тех пор, пока не пройдет заданный интервал после последнего вызова. Подходит для поиска на лету или обработки ввода.
- Throttling - гарантирует, что функция будет вызываться не чаще одного раза за интервал. Подходит для скролла или ресайза.
Пример реализации debouncing с возвратом результата (через Promise):
JAVASCRIPTfunction debounce(fn, delay) {let timer;let resolveList = [];return function(...args) {return new Promise((resolve) => {resolveList.push(resolve);clearTimeout(timer);timer = setTimeout(() => {const result = fn.apply(this, args);resolveList.forEach(res => res(result));resolveList = [];}, delay);});};}
Что возвращать:
- Если лимит превышен - возвращать последний успешный результат (если он есть) или отклоненный Promise с ошибкой (например,
new Error('Rate limit exceeded')). - В реальных приложениях (например, API-запросах) часто возвращают кэшированное значение или null с уведомлением пользователя.
Пример для API с лимитом:
JAVASCRIPTconst fetchWithLimit = (() => {let lastCall = 0;const LIMIT_MS = 1000;let cachedResult = null;return async (url) => {const now = Date.now();if (now - lastCall < LIMIT_MS) {return cachedResult ?? Promise.reject(new Error('Too many requests'));}lastCall = now;cachedResult = await fetch(url).then(res => res.json());return cachedResult;};})();
Рекомендация: Всегда документируйте поведение при превышении лимита и предоставляйте fallback (например, последние данные или сообщение об ошибке).
> Похожие задачи по frontend
Как обработать ошибку, если хотя бы один из нескольких запросов не ответил в JavaScript?
Как обработать результаты двух асинхронных запросов с условиями success, fail и timeout в JavaScript?
Как реализовать метод перезагрузки счетчика вызовов функции в декораторе JavaScript
Какие встроенные методы JavaScript помогают соединить строки с разделителем
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью