Ответ
Promise.allSettled() — это статический метод, который принимает итерируемую коллекцию промисов (например, массив) и возвращает новый промис. Этот новый промис выполнится (fulfilled) только после того, как все переданные промисы будут завершены — независимо от того, успешно (fulfilled) или с ошибкой (rejected).
Ключевое отличие от Promise.all(): Promise.all() немедленно завершается с ошибкой, если хотя бы один из промисов отклоняется. Promise.allSettled() ждёт завершения всех, что критически важно для сценариев, где нужно обработать результаты всех операций (например, отправка аналитики, массовая обработка записей).
Пример в контексте Node.js (обработка нескольких API-запросов):
const axios = require('axios');
const apiEndpoints = [
'https://api.example.com/users',
'https://api.example.com/posts',
'https://api.invalid-url.com/error' // Этот запрос завершится ошибкой
];
const promises = apiEndpoints.map(url => axios.get(url).catch(e => e));
Promise.allSettled(promises)
.then(results => {
console.log('Итоги всех запросов:');
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`✅ Запрос ${index}: Успех. Данные:`, result.value.data);
} else {
console.log(`❌ Запрос ${index}: Ошибка. Причина:`, result.reason.message);
}
});
});
Структура результата: Каждый элемент в результирующем массиве — это объект с обязательным полем status.
- Если
status: 'fulfilled', то присутствует свойствоvalue, содержащее результат успешного промиса. - Если
status: 'rejected', то присутствует свойствоreason, содержащее ошибку (например, объектError).
Ответ 18+ 🔞
Слушай, вот есть у тебя куча промисов, как стадо баранов, и надо их всех дождаться, чтобы понять, кто дошёл до финиша, а кто в яму с говном свалился. Раньше с Promise.all() была история — один косякнет, и всё, пиздец, вся цепочка летит к чертям собачьим, доверия ебать ноль. А жизнь-то, ёпта, сложнее бывает!
Вот представь: шлёшь ты кучу запросов на разные API — один за юзерами, другой за постами, а третий, допустим, на сдохший сервер. И тебе похуй, что какой-то сломался, тебе главное — получить картину целиком, кто ответил, а кто нет. Вот для этого и придумали Promise.allSettled(). Он, сука, терпеливый, как монах, ждёт, пока ВСЕ промисы успокоятся — хоть успешно, хоть с пиздюлиной.
Возвращает он массив объектов, и тут два варианта, проще некуда:
status: 'fulfilled'— значит, промис не подвёл, и вvalueлежит твой честно заработанный результат.status: 'rejected'— ну тут всё ясно, промис накрылся медным тазом, и вreasonсидит ошибка, которую он выкинул.
Вот смотри, как это в деле выглядит, на примере этих самых API-запросов:
const axios = require('axios');
const apiEndpoints = [
'https://api.example.com/users',
'https://api.example.com/posts',
'https://api.invalid-url.com/error' // Этот, бля, точно сдохнет
];
const promises = apiEndpoints.map(url => axios.get(url).catch(e => e));
Promise.allSettled(promises)
.then(results => {
console.log('Итоги всех запросов:');
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`✅ Запрос ${index}: Успех. Данные:`, result.value.data);
} else {
console.log(`❌ Запрос ${index}: Ошибка. Причина:`, result.reason.message);
}
});
});
Короче, если тебе нужен тотальный контроль и чтобы ни один промис не ушёл от ответа — это твой инструмент. А если тебе, как раньше, принципиально, чтобы все были святыми и безгрешными, тогда Promise.all(). Выбор за тобой, чувак.