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

Повтор с нарастающей паузой

Условие

retry(fn, { attempts, baseDelay, factor, shouldRetry, sleep }): повторяет с паузами baseDelay, baseDelay*factor и так далее. shouldRetry(error) решает, имеет ли смысл повтор. sleep передаётся для проверяемости.

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

  • успех с первой попытки

  • нарастающие паузы

  • после успеха повторов нет

  • безнадёжная ошибка не повторяется

  • номер попытки передаётся

  • после исчерпания бросается последняя ошибка

Как подойти

Три вещи отличают взрослый повтор от наивного цикла. Нарастающая пауза: при массовом сбое одинаковые интервалы у тысячи клиентов добьют сервер. Условие повтора: повторять надо только временные ошибки (сеть, 429, 5xx), а не 4xx. Отсутствие паузы после последней попытки: иначе пользователь ждёт лишнее время впустую. В бою сюда добавляют случайный разброс, чтобы клиенты не приходили одновременно.

Подсказки: 3
  1. Паузы растут как baseDelay * factor^номер.
  2. После последней попытки паузы быть не должно.
  3. Не всякая ошибка стоит повтора: 404 и 400 повторять бессмысленно.

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

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