JavaScript fetch retry: повторить запрос с exponential backoff

Категория: JavaScript · Язык: JavaScript · Обновлено:

Повтор с экспоненциальной задержкой помогает пережить временные сетевые ошибки и ответы 5xx. Ограничьте число попыток и применяйте такую стратегию только к операциям, которые безопасно повторять.

Рабочий пример

JavaScript
async function fetchWithRetry(url, attempts = 3) {
  for (let i = 0; i < attempts; i++) {
    try {
      const response = await fetch(url);
      if (response.status < 500) return response;
      if (i === attempts - 1) return response;
    } catch (error) {
      if (i === attempts - 1) throw error;
    }
    await new Promise(resolve => setTimeout(resolve, 250 * 2 ** i));
  }
  throw new Error('No attempts made');
}

Задержка удваивается после каждой неудачи. Ответ 4xx возвращается сразу: обычно он требует исправления запроса, а не повтора.

Частый вопрос

Нужно ли повторять HTTP 429?

Можно, если учитывать Retry-After и ограничить общий срок ожидания. Не запускайте бесконечные повторы и не игнорируйте лимиты сервиса.