Выполните не более заданного числа вызовов, возвращая первый успешный результат; после всех неудач верните последнюю ошибку, как требует условие.
Реализуйте функцию 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, чтобы не спутать ошибку с успешными данными; повтор операций с побочными эффектами требует отдельной политики.