Ответ
Promise.all и Promise.allSettled оба работают с массивом промисов, но ведут себя по-разному при обработке ошибок.
- Promise.all:
Возвращает массив результатов, если все промисы успешно выполняются. Если хотя бы один промис отклоняется, весьPromise.allнемедленно отклоняется с этой ошибкой.
Пример:
Promise.all([promise1, promise2])
.then(results => console.log(results))
.catch(error => console.error(error)); // Прервётся при первой ошибке
- Promise.allSettled:
Дожидается завершения всех промисов (независимо от успеха/ошибки) и возвращает массив объектов с статусом и значением/причиной.
Пример:
Promise.allSettled([promise1, promise2])
.then(results => results.forEach(result => {
if (result.status === 'fulfilled') console.log(result.value);
else console.error(result.reason);
}));
Итог:
all— "всё или ничего".allSettled— "дождаться всех".
Ответ 18+ 🔞
А, ну это же про наши любимые промисы, да? Ситуация, блядь, классическая: у тебя куча асинхронной хуйни, и её надо как-то обработать. Так вот, Promise.all и Promise.allSettled — это как два разных начальника на стройке.
Представь: Promise.all — это такой, блядь, мажор-перфекционист. Ему подавай всё идеально. Отдаёшь ему пачку промисов — он их начинает выполнять параллельно. И если все задачи сделаны, красава, он тебе вывалит аккуратный массив результатов. Но! Если хоть один, сука, промис ляжет с ошибкой — всё, пиздец. Весь этот Promise.all тут же зафейлится с этой самой первой ошибкой, а на остальные ему насрать. Остальные промисы-то будут работать, но их результаты уже никому не упёрлись. Это как "всё или ничего". Либо полный успех, либо — в рот меня чих-пых — полный провал.
Promise.all([fetchUser(), fetchPosts()])
.then(([user, posts]) => console.log('Всё заебись!', user, posts))
.catch(error => console.error('Один обосрался — всем пизда!', error));
А теперь Promise.allSettled — это уже начальник-реалист, который понимает, что в жизни всякое бывает. Ему тоже отдаёшь пачку промисов. Он их тоже параллельно запускает. Но он, хитрая жопа, дождётся ВСЕХ до единого, пока они не успокоятся — неважно, успешно или с треском. Потом он тебе выдаст не просто массив результатов, а массив отчётов. Каждый отчёт — объект с полем status. Если промис зарезолвился, будет status: 'fulfilled' и в value лежит результат. Если отклонился — будет status: 'rejected' и в reason причина провала. И ни один, блядь, промис не пропадёт зря. Это подход "дождаться всех, а там разберёмся".
Promise.allSettled([fetchUser(), fetchPosts()])
.then(results => results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('Задача выполнена:', result.value);
} else {
console.log('Задача обосралась, но мы это знаем:', result.reason);
}
}));
Короче, итог простой, ёпта:
- Нужен тотальный успех и первая ошибка — смертельна? Бери
Promise.all. "Всё или ничего". - Нужно просто дождаться завершения всей этой кутерьмы, чтобы ни случилось, и обработать что получилось? Тогда твой выбор —
Promise.allSettled. "Дождаться всех".