Skip to content

Instantly share code, notes, and snippets.

@IlyaIvanchikov
Created October 12, 2025 13:28
Show Gist options
  • Select an option

  • Save IlyaIvanchikov/efaf5bd3d9c0a8f453c0cfdb1bf57ccf to your computer and use it in GitHub Desktop.

Select an option

Save IlyaIvanchikov/efaf5bd3d9c0a8f453c0cfdb1bf57ccf to your computer and use it in GitHub Desktop.
// Функция "сон" — приостанавливает выполнение на указанное количество миллисекунд
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
// Вычисляет задержку для каждой попытки по экспоненциальной формуле
function getBackoffTime(attempt, baseDelay, multiplier) {
// умножаем базовую задержку на фактор, возведённый в степень номера попытки
return baseDelay * Math.pow(multiplier, attempt);
}
// Основная функция повторных попыток с экспоненциальным ростом интервала
async function executeWithBackoff(action, maxAttempts, baseDelay = 1000, multiplier = 2) {
// счётчик количества попыток
let attempt = 0;
// пока не превысили лимит попыток
while (attempt <= maxAttempts) {
try {
// пробуем выполнить операцию
return await action();
} catch (err) {
// если достигли лимита, выбрасываем ошибку
if (attempt >= maxAttempts) {
throw err;
}
// вычисляем задержку перед следующей попыткой
const timeout = getBackoffTime(attempt, baseDelay, multiplier);
// выводим информацию в консоль
console.log(`Попытка №${attempt + 1} не удалась, повтор через ${timeout}мс...`);
// ждём рассчитанное время
await sleep(timeout);
// увеличиваем счётчик попыток
attempt++;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment