Вопрос проверяет умение работать с несколькими асинхронными операциями одновременно и объединять их результаты, что критично для эффективной загрузки данных в современных веб-приложениях.
В современной веб-разработке часто возникает необходимость выполнить несколько независимых запросов к API, базе данных или файловой системе и обработать их результаты вместе. Последовательное выполнение (один за другим) приводит к накоплению задержек и плохому пользовательскому опыту. Решением является параллельное выполнение с последующим агрегированием результатов.
Стандартный метод Promise.all(iterable) принимает итерируемую коллекцию (чаще всего массив) промисов и возвращает один промис. Этот результирующий промис переходит в состояние fulfilled (выполнено) только когда все переданные промисы успешно завершатся. Его значением будет массив результатов в том же порядке, в котором передавались промисы. Если любой из промисов завершится с ошибкой (rejected), то и Promise.all немедленно завершится с этой же ошибкой, игнорируя результаты остальных (даже если они уже выполнены).
async function fetchUserData(userId) {
const [profile, orders, messages] = await Promise.all([
fetch(`/api/users/${userId}/profile`).then(r => r.json()),
fetch(`/api/users/${userId}/orders`).then(r => r.json()),
fetch(`/api/users/${userId}/messages`).then(r => r.json())
]);
return { profile, orders, messages };
}
// Использование
fetchUserData(123)
.then(data => console.log('Все данные:', data))
.catch(err => console.error('Один из запросов не удался:', err));Иногда требуется более гибкое поведение:
fulfilled или rejected и значение/причина). Полезно, когда нужно обработать все результаты, даже если некоторые запросы завершились с ошибкой.// Пример с allSettled
const promises = [
fetch('/api/data1'),
fetch('/api/data2'),
Promise.reject(new Error('Искусственная ошибка'))
];
const results = await Promise.allSettled(promises);
const successfulData = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value);Данный подход широко используется при загрузке данных для инициализации страницы (например, профиль пользователя, его настройки и уведомления), агрегации информации из нескольких источников (разные микросервисы, сторонние API) или параллельном выполнении независимых задач (валидация нескольких полей формы, загрузка нескольких изображений).
Вывод: Используйте Promise.all для параллельного выполнения независимых асинхронных операций, когда вам нужны все результаты одновременно и вы готовы обработать возможную ошибку любого из запросов. Для более устойчивой обработки, где ошибки отдельных операций допустимы, выбирайте Promise.allSettled.