Fetch / XHR: Fetch повторы с экспоненциальной паузой (сетевые сбои)

Даже у стабильных API бывают временные сбои: плохое соединение, перегрузка сервера, случайные ошибки 5xx. Чтобы не ломать логику при первом же сбое, можно повторить запрос несколько раз с паузой, которая увеличивается после каждой неудачи.

Экспоненциальная пауза — это задержка между повторами, которая растёт по формуле:

delay = baseDelay * 2^(attempt - 1)

Например, если baseDelay = 300ms, то паузы будут: 300мс → 600мс → 1200мс и т.д.

Используется:

  • При интеграции с внешними API (платёжные системы, CRM, почтовые сервисы)
  • При временной потере сети на клиенте
  • В фоновом обновлении данных (чтобы избежать постоянной нагрузки на сервер)
async function retry(fn, {retries = 3, baseDelay = 300} = {}) {
	let attempt = 0;
	while (true) {
		try 
		{
			return await fn();
		} 
		catch (err) 
		{
			attempt++;
			const isLast = attempt > retries;
			const message = String(err.message || '');
			const retriable = /network|timeout|HTTP 5\d\d/i.test(message);
			if (isLast || !retriable) throw err;
			const delay = baseDelay * 2 ** (attempt - 1);
			await new Promise(r => setTimeout(r, delay));
		}
	}
}

// Пример
(async () => {
	const loader = () => fetchJson('https://api.example.com/stats');
	try {
		const data = await retry(loader, {retries: 2, baseDelay: 400});
		console.log('Статистика:', data);
	} catch (err) {
		console.error('После повторов всё ещё ошибка:', err.message);
	}
})();
1.2 г. Просмотров: 401
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram