Повторяйте fetch при отклонении Promise и после последней попытки выбрасывайте ту же ошибку; HTTP 4xx/5xx сами по себе не отклоняют fetch.
Реализуйте обёртку над fetch с повторами: она принимает количество повторных попыток и аргументы fetch, возвращает тот же результат, что fetch, а после исчерпания попыток выбрасывает последнюю ошибку.
Повторяйте fetch при отклонении Promise и после последней попытки выбрасывайте ту же ошибку; HTTP 4xx/5xx сами по себе не отклоняют fetch.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Повторяйте fetch при отклонении Promise и после последней попытки выбрасывайте ту же ошибку; HTTP 4xx/5xx сами по себе не отклоняют fetch.
Минимальный вариант для повторяемого тела запроса:
async function fetchRetry(retries, ...args) {
if (!Number.isInteger(retries) || retries < 0) throw new RangeError('retries');
for (let attempt = 0; ; attempt++) {
try { return await fetch(...args); }
catch (error) {
if (attempt === retries || error?.name === 'AbortError') throw error;
}
}
}
Здесь retries — число повторов сверх первой попытки; отмена не повторяется. Для production нужны задержки, проверка идемпотентности и фабрика запросов для одноразовых stream-body.