JavaScript fetch retry: повторить запрос с exponential backoff
Повтор с экспоненциальной задержкой помогает пережить временные сетевые ошибки и ответы 5xx. Ограничьте число попыток и применяйте такую стратегию только к операциям, которые безопасно повторять.
Рабочий пример
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 и ограничить общий срок ожидания. Не запускайте бесконечные повторы и не игнорируйте лимиты сервиса.