Повторяйте fetch в цикле, включая HTTP-ошибки и ошибки чтения JSON. После исчерпания попыток выбросьте ошибку с заданным сообщением.
Надёжный GET‑запрос с автоматическим повтором
Повторяйте fetch в цикле, включая HTTP-ошибки и ошибки чтения JSON. После исчерпания попыток выбросьте ошибку с заданным сообщением.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется реализовать функцию, принимающую строку‑адрес, выполнять асинхронный GET‑запрос к этому ресурсу с помощью fetch и возвращать полученный JSON. При любой ошибке запрос должен автоматически повторяться до пяти раз. Если после всех попыток данные так и не получены, функция должна отклоняться с ошибкой «Заданный URL недоступен».
function fetchWithRetry(endpoint) {
// your code here
}
fetchWithRetry(url)
.then(res => console.log(res))
.catch(err => console.error(err));
Ответ
Повторяйте fetch в цикле, включая HTTP-ошибки и ошибки чтения JSON. После исчерпания попыток выбросьте ошибку с заданным сообщением.
«До пяти повторов» ниже означает один исходный запрос и пять повторных:
async function fetchWithRetry(endpoint) {
let cause;
for (let attempt = 0; attempt <= 5; attempt++) {
try {
const response = await fetch(endpoint);
if (!response.ok) throw new Error('HTTP ' + response.status);
return await response.json();
} catch (error) { cause = error; }
if (attempt < 5) await new Promise(resolve => setTimeout(resolve, 100 * 2 ** attempt));
}
throw new Error('Заданный URL недоступен', { cause });
}
Если нужны пять попыток всего, измените границы цикла. В production обычно не повторяют постоянные 4xx и пользовательскую отмену; отдельный таймаут нужен для запроса, который не завершается вообще.