Created
October 12, 2025 13:28
-
-
Save IlyaIvanchikov/efaf5bd3d9c0a8f453c0cfdb1bf57ccf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Функция "сон" — приостанавливает выполнение на указанное количество миллисекунд | |
| 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