После fetch проверяйте response.ok и превращайте неуспешный HTTP-статус в ошибку внутри retry-цикла. Сам fetch обычно не отклоняет Promise из-за 4xx или 5xx.
Как доработать retry-обёртку над fetch, чтобы повторять запрос и при HTTP-ответе с response.ok === false?
После fetch проверяйте response.ok и превращайте неуспешный HTTP-статус в ошибку внутри retry-цикла. Сам fetch обычно не отклоняет Promise из-за 4xx или 5xx.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
После fetch проверяйте response.ok и превращайте неуспешный HTTP-статус в ошибку внутри retry-цикла. Сам fetch обычно не отклоняет Promise из-за 4xx или 5xx.
Минимальный пример для повторяемого GET:
async function fetchRetry(url, attempts = 3) {
if (!Number.isInteger(attempts) || attempts < 1) {
throw new RangeError('attempts >= 1');
}
for (let i = 1; i <= attempts; i++) {
try {
const response = await fetch(url);
if (response.ok) return response;
await response.body?.cancel();
throw new Error('HTTP ' + response.status);
} catch (error) {
if (i === attempts) throw error;
}
}
}
В production обычно повторяют только временные ошибки с backoff и Retry-After, не любой 4xx. Для изменяющих запросов нужны идемпотентность и повторяемое тело; отмену пользователем не следует повторять.