Fetch с повторными попытками (fetchWithRetry)

3

GoJavaJavaScriptPython

Асинхронность

Avito

Условие:

Реализуйте функцию 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 ≤ 10

  • options.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, симулирующую разные сценарии.

Loading...