retryFetch с условиями
Условие
Обёртка над fetch, повторяющая запрос при неудаче не более attempts раз. Условия: метод PUT не повторяем вовсе; ответы 401 и 403 не повторяем; когда попытки кончились - отклоняемся последней ошибкой. Успешным считается ответ с ok === true. Функция запроса приходит первым аргументом - так задача проверяема.
Что проверяют тесты
успех с первой попытки
повторяет при ошибке
PUT не повторяется
401 не повторяется
403 не повторяется
после исчерпания - последняя ошибка
метод без регистра
Как подойти
Главная ловушка формулировки: fetch не бросает на 500, он возвращает ответ с ok === false. Поэтому «неудача» здесь двух видов - сетевая ошибка в catch и плохой статус в теле. Запреты тоже разной природы: PUT неидемпотентен, и повтор может создать вторую запись; 401 и 403 повторять бессмысленно, права не появятся сами. В бою сюда добавляют нарастающую паузу и отказ от повтора на всех 4xx, кроме 408 и 429.
Подсказки: 3
- Неуспешный статус - не исключение: fetch отклоняется только на сетевой ошибке.
- Два разных запрета: по методу и по коду ответа - их надо проверять в разных местах.
- Метод может прийти в любом регистре.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.