retry с backoff и фильтром ошибок
Условие
Напиши retry(fn, { retries, baseMs, factor = 2, shouldRetry = () => true }). Вызывает асинхронную fn(attempt) (attempt с 1). Если она бросила и shouldRetry(err) вернул true и попытки остались, ждёт baseMs * factor^(attempt-1) мс и пробует снова. Всего не больше retries + 1 вызовов. Если попытки кончились или ошибка не ретраится, промис отклоняется последней ошибкой.
Например, ошибку 400 (кривой запрос) ретраить бессмысленно, а 503 стоит.
Что проверяют тесты
успех с третьей попытки
попытки кончились: последняя ошибка
не ретраит, если shouldRetry вернул false
задержки растут экспоненциально
retries: 0 значит одна попытка
успех сразу без пауз
Как подойти
Подсказки: 2
- Цикл по попыткам с try/catch внутри.
- Перед ожиданием проверь два условия: остались ли попытки и ретраится ли ошибка.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
mapLimit: параллельная обработка с ограничением
Следующий вопрос
Семафор для ограничения доступа к ресурсу