Повтор с нарастающей паузой
Условие
retry(fn, { attempts, baseDelay, factor, shouldRetry, sleep }): повторяет с паузами baseDelay, baseDelay*factor и так далее. shouldRetry(error) решает, имеет ли смысл повтор. sleep передаётся для проверяемости.
Что проверяют тесты
успех с первой попытки
нарастающие паузы
после успеха повторов нет
безнадёжная ошибка не повторяется
номер попытки передаётся
после исчерпания бросается последняя ошибка
Как подойти
Три вещи отличают взрослый повтор от наивного цикла. Нарастающая пауза: при массовом сбое одинаковые интервалы у тысячи клиентов добьют сервер. Условие повтора: повторять надо только временные ошибки (сеть, 429, 5xx), а не 4xx. Отсутствие паузы после последней попытки: иначе пользователь ждёт лишнее время впустую. В бою сюда добавляют случайный разброс, чтобы клиенты не приходили одновременно.
Подсказки: 3
- Паузы растут как baseDelay * factor^номер.
- После последней попытки паузы быть не должно.
- Не всякая ошибка стоит повтора: 404 и 400 повторять бессмысленно.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.