Код Senior Реализация с нуля обновлено

Ограничитель частоты

Условие

rateLimit(fn, limit, window): не больше limit вызовов за окно window мс. Лишние вызовы откладываются до освобождения окна, порядок сохраняется. Каждый вызов возвращает промис с результатом.

Что проверяют тесты

  • первые вызовы проходят сразу

  • сверх лимита откладывается

  • результат доходит до вызывающего

  • порядок сохраняется

  • ошибка доходит до вызывающего

Как подойти

Скользящее окно: массив времён вызовов, из головы выбрасываем всё старше window. Отличие от throttle в том, что лишние вызовы не выбрасываются, а ждут очереди - и каждому нужно вернуть его собственный промис. Один общий таймер вместо таймера на вызов: иначе при тысяче вызовов получишь тысячу таймеров. Практика - соблюдение лимитов чужого API.

Подсказки: 3
  1. Храни моменты последних вызовов и выбрасывай те, что вышли из окна.
  2. Очередь хранит аргументы вместе с resolve и reject.
  3. Один отложенный таймер на всю очередь, а не по таймеру на вызов.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.