Как доработать retry-обёртку над fetch, чтобы повторять запрос и при HTTP-ответе с response.ok === false?

После fetch проверяйте response.ok и превращайте неуспешный HTTP-статус в ошибку внутри retry-цикла. Сам fetch обычно не отклоняет Promise из-за 4xx или 5xx.

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

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

После fetch проверяйте response.ok и превращайте неуспешный HTTP-статус в ошибку внутри retry-цикла. Сам fetch обычно не отклоняет Promise из-за 4xx или 5xx.

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

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

После fetch проверяйте response.ok и превращайте неуспешный HTTP-статус в ошибку внутри retry-цикла. Сам fetch обычно не отклоняет Promise из-за 4xx или 5xx.

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

async function fetchRetry(url, attempts = 3) {
  if (!Number.isInteger(attempts) || attempts < 1) {
    throw new RangeError('attempts >= 1');
  }
  for (let i = 1; i <= attempts; i++) {
    try {
      const response = await fetch(url);
      if (response.ok) return response;
      await response.body?.cancel();
      throw new Error('HTTP ' + response.status);
    } catch (error) {
      if (i === attempts) throw error;
    }
  }
}

В production обычно повторяют только временные ошибки с backoff и Retry-After, не любой 4xx. Для изменяющих запросов нужны идемпотентность и повторяемое тело; отмену пользователем не следует повторять.

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

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

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

Подробнее