Реализуйте функцию request: она вызывает getData, возвращает успешный результат, а при ошибке повторяет вызов до заданного количества попыток и после исчерпания попыток возвращает последнюю ошибку.

Выполните не более заданного числа вызовов, возвращая первый успешный результат; после всех неудач верните последнюю ошибку, как требует условие.

Короткий ответ

Что ответить на собеседовании

Выполните не более заданного числа вызовов, возвращая первый успешный результат; после всех неудач верните последнюю ошибку, как требует условие.

Подробный разбор

Ответ с пояснениями

Выполните не более заданного числа вызовов, возвращая первый успешный результат; после всех неудач верните последнюю ошибку, как требует условие.

Здесь attempts включает первоначальный вызов:

async function request(getData, attempts) {
  if (!Number.isInteger(attempts) || attempts < 1) throw new RangeError('attempts');
  let lastError;
  for (let i = 0; i < attempts; i++) {
    try { return await getData(); }
    catch (error) { lastError = error; }
  }
  return lastError;
}

Это fulfilled Promise с ошибкой как значением, не reject. В реальном API часто удобнее throw или tagged result, чтобы не спутать ошибку с успешными данными; повтор операций с побочными эффектами требует отдельной политики.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее