Ограничитель частоты
Условие
rateLimit(fn, limit, window): не больше limit вызовов за окно window мс. Лишние вызовы откладываются до освобождения окна, порядок сохраняется. Каждый вызов возвращает промис с результатом.
Что проверяют тесты
первые вызовы проходят сразу
сверх лимита откладывается
результат доходит до вызывающего
порядок сохраняется
ошибка доходит до вызывающего
Как подойти
Скользящее окно: массив времён вызовов, из головы выбрасываем всё старше window. Отличие от throttle в том, что лишние вызовы не выбрасываются, а ждут очереди - и каждому нужно вернуть его собственный промис. Один общий таймер вместо таймера на вызов: иначе при тысяче вызовов получишь тысячу таймеров. Практика - соблюдение лимитов чужого API.
Подсказки: 3
- Храни моменты последних вызовов и выбрасывай те, что вышли из окна.
- Очередь хранит аргументы вместе с resolve и reject.
- Один отложенный таймер на всю очередь, а не по таймеру на вызов.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.