Fetch с повторными попытками (fetchWithRetry)
3
Асинхронность
Условие:
Реализуйте функцию fetchWithRetry(url, options, retries), которая отправляет HTTP-запрос с помощью fetch и автоматически повторяет его при неудаче.
Функция должна соблюдать следующие правила:
Если запрос завершился успешно (статус
response.ok === true), вернуть объектresponse.Если ответ пришёл со статусом
401(Unauthorized) или403(Forbidden) — немедленно вернуть reject с ошибкой, не делая повторных попыток.Если метод запроса —
PUT— повторные попытки не разрешены: максимум 1 попытка (т.е.retriesпринудительно устанавливается в1).Если все попытки исчерпаны и ни одна не удалась — вернуть reject с последней ошибкой.
В остальных случаях — повторять запрос, пока не закончатся попытки.
Входные данные:
url(string) — адрес запросаoptions(object) — параметры fetch:{ method, headers, body, ... }retries(number) — максимальное количество попыток (≥ 1)
Выходные данные:
Promise, который resolves с объектом Response при успехе, или rejects с объектом Error при неудаче.
Ограничения:
1 ≤ retries ≤ 10options.method— одно из"GET","POST","PUT","DELETE"Без задержки между попытками (для простоты)
Среда: Node.js / браузер с поддержкой
fetch
Пример:
Вход: url = "https://api.example.com/data", options = { method: "GET" }, retries = 3
// Сервер дважды отвечает 500, третий раз — 200
Выход: Promise<Response> (resolved, статус 200)
Вход: url = "...", options = { method: "GET" }, retries = 3
// Сервер отвечает 401
Выход: Promise<Error> (rejected немедленно, без повторов)
Вход: url = "...", options = { method: "PUT" }, retries = 5
// retries принудительно = 1, одна попытка
Выход: Promise<Response> или Promise<Error> (только 1 попытка)
Тест будет использовать mock-реализацию fetch, симулирующую разные сценарии.