JavaScript: Promise.all и Promise.allSettled
Promise.all() ждёт все операции и возвращает результаты в исходном порядке, но отклоняется при первой ошибке. Promise.allSettled() дожидается завершения каждой операции и возвращает статус каждой из них — выбирайте его, когда отдельный сбой не должен скрывать остальные ответы.
Promise.all: все операции обязательны
const loadUser = async (id) => ({id, name: `user-${id}`});
const results = await Promise.all([loadUser(1), loadUser(2)]);
console.log(results.map((item) => item.id).join(',')); // 1,2Порядок элементов результата соответствует порядку входного массива, даже если операции завершились в другой последовательности.
Promise.allSettled: собрать успехи и ошибки
const results = await Promise.allSettled([
Promise.resolve('профиль'),
Promise.reject(new Error('сервис недоступен'))
]);
const summary = results.map((result) => result.status);
console.log(summary.join(',')); // fulfilled,rejectedДля чтения значений проверяйте status: у успешного результата поле value, у ошибки — reason.
const settled = await Promise.allSettled([
Promise.resolve('профиль'),
Promise.reject(new Error('сервис недоступен'))
]);
for (const result of settled) {
if (result.status === 'fulfilled') console.log('Готово:', result.value);
else console.error('Не удалось загрузить:', result.reason.message);
}Метод | Когда отклоняется | Что возвращает |
|---|---|---|
| При первом отклонённом Promise | Массив значений |
| Не отклоняется из-за результата элементов | Массив объектов со статусами |
Как дождаться нескольких независимых запросов?
Используйте Promise.all([fetchA(), fetchB()]), если для ответа нужны оба результата. Если допустим частичный экран, используйте Promise.allSettled() и обработайте каждый статус.
В каком порядке придут результаты?
В порядке Promise во входном массиве, а не в порядке завершения запросов.