Реализуйте обёртку над fetch с повторами: она принимает количество повторных попыток и аргументы fetch, возвращает тот же результат, что fetch, а после исчерпания попыток выбрасывает последнюю ошибку.

Повторяйте fetch при отклонении Promise и после последней попытки выбрасывайте ту же ошибку; HTTP 4xx/5xx сами по себе не отклоняют fetch.

Короткий ответ

Что ответить на собеседовании

Повторяйте fetch при отклонении Promise и после последней попытки выбрасывайте ту же ошибку; HTTP 4xx/5xx сами по себе не отклоняют fetch.

Подробный разбор

Ответ с пояснениями

Повторяйте fetch при отклонении Promise и после последней попытки выбрасывайте ту же ошибку; HTTP 4xx/5xx сами по себе не отклоняют fetch.

Минимальный вариант для повторяемого тела запроса:

async function fetchRetry(retries, ...args) {
  if (!Number.isInteger(retries) || retries < 0) throw new RangeError('retries');
  for (let attempt = 0; ; attempt++) {
    try { return await fetch(...args); }
    catch (error) {
      if (attempt === retries || error?.name === 'AbortError') throw error;
    }
  }
}

Здесь retries — число повторов сверх первой попытки; отмена не повторяется. Для production нужны задержки, проверка идемпотентности и фабрика запросов для одноразовых stream-body.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее