Даже у стабильных 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);
}
})();
Комментарии
0Нашли ошибку или хотите дополнить материал?