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

retryFetch с условиями

Условие

Обёртка над fetch, повторяющая запрос при неудаче не более attempts раз. Условия: метод PUT не повторяем вовсе; ответы 401 и 403 не повторяем; когда попытки кончились - отклоняемся последней ошибкой. Успешным считается ответ с ok === true. Функция запроса приходит первым аргументом - так задача проверяема.

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

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

  • повторяет при ошибке

  • PUT не повторяется

  • 401 не повторяется

  • 403 не повторяется

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

  • метод без регистра

Как подойти

Главная ловушка формулировки: fetch не бросает на 500, он возвращает ответ с ok === false. Поэтому «неудача» здесь двух видов - сетевая ошибка в catch и плохой статус в теле. Запреты тоже разной природы: PUT неидемпотентен, и повтор может создать вторую запись; 401 и 403 повторять бессмысленно, права не появятся сами. В бою сюда добавляют нарастающую паузу и отказ от повтора на всех 4xx, кроме 408 и 429.

Подсказки: 3
  1. Неуспешный статус - не исключение: fetch отклоняется только на сетевой ошибке.
  2. Два разных запрета: по методу и по коду ответа - их надо проверять в разных местах.
  3. Метод может прийти в любом регистре.

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

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