Каким методом промиса получить результат первого выполненного запроса?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Для получения результата первого завершившегося промиса используют Promise.race(). Он возвращает результат того промиса, который первым перейдёт в состояние fulfilled или rejected. Если нужен именно первый успешно выполненный запрос, дополнительно надо отфильтровать ошибки или обработать их отдельно.
Определение:
Promise.race() — это статический метод Promise, который принимает массив промисов и возвращает промис, завершающийся так же, как первый из переданных промисов. Важно: первым может оказаться не только успешный результат, но и ошибка. Поэтому для задачи “получить результат первого выполненного запроса” часто используют Promise.race() вместе с обработкой отказов или альтернативную логику, если нужен именно первый успешный ответ.
Пример использования:
const request1 = fetch('/api/user/1');
const request2 = fetch('/api/user/2');
const request3 = fetch('/api/user/3');
Promise.race([request1, request2, request3])
.then(response => response.json())
.then(data => {
console.log('Первый завершившийся запрос:', data);
})
.catch(error => {
console.error('Первым завершился запрос с ошибкой:', error);
});
Пояснение кода:
- Создаются три асинхронных запроса.
Promise.race([...])отслеживает все промисы и ждёт тот, который завершится первым.- Если первым завершится успешный
fetch, вthenпопадёт его ответ. - Если первым завершится ошибка, управление перейдёт в
catch.
Если нужен именно первый успешный результат, а не просто первый завершившийся, то Promise.race() в чистом виде не всегда подходит: отказавшийся промис может “выиграть гонку”.
Ключевые моменты:
Promise.race()возвращает результат первого завершившегося промиса.- Победителем может быть как
fulfilled, так иrejected. - Для “первого успешного ответа” нужно отдельно учитывать ошибки.
- Метод полезен для таймаутов, резервных источников данных и параллельных запросов.
- Если важен именно первый успешный результат без учёта ошибок, часто требуется дополнительная обвязка над
Promise.race().