Механизм повторных попыток оборачивает async функцию и автоматически перезапускает её при ошибке, вплоть до определённого количества попыток, с настраиваемой задержкой между каждой повторной попыткой.
async function retry(fn, retries = 3, delay = 1000) {
for (let i = 0; i <= retries; i++) {
try {
return await fn();
} catch (err) {
if (i === retries) throw err;
await new Promise(r => setTimeout(r, delay));
}
}
}
fn (async операция), retries (максимальное количество попыток, по умолчанию 3), и delay (миллисекунды между попытками, по умолчанию 1000)await'ит переданную функцию внутри блока try/catchsetTimeout, обёрнутого в Promise, затем цикл продолжаетсяasync/await делает логику чистой и читаемой по сравнению с цепочками .then() вызововnew Promise(r => setTimeout(r, delay)), что является стандартным способом создать неблокирующую паузуretries + 1 раз — первая попытка плюс все повторныеawait retry(() => fetch('https://api.example.com/data'), 3, 2000);
Этот подход практичен и готов к использованию в продакшене, часто применяется для сетевых запросов, обращений к базе данных или любых ненадёжных I/O операций.
Условие цикла i <= retries гарантирует, что функция выполняется всего retries + 1 раз, учитывая начальную попытку плюс все повторные попытки.
Новый — ещё не проверен сообществом
Вы