Код Middle Асинхронные паттерны спрашивают часто обновлено

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
  1. Цикл по попыткам с try/catch внутри.
  2. Перед ожиданием проверь два условия: остались ли попытки и ретраится ли ошибка.

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

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

Термины по теме