Как узнать при выполнении нескольких Promise какие упали и какие выполнились

Ответ

Для этого можно использовать Promise.allSettled(). Он возвращает массив результатов всех промисов, независимо от их статуса (fulfilled/rejected). Каждый результат — объект с полями:

  • status: "fulfilled" или "rejected"
  • value (если fulfilled) или reason (если rejected)

Пример:

const promises = [
  Promise.resolve('Успех'),
  Promise.reject('Ошибка'),
  Promise.resolve('Ещё успех')
];

Promise.allSettled(promises).then(results => {
  results.forEach((result, index) => {
    if (result.status === 'fulfilled') {
      console.log(`Промис ${index} успешен:`, result.value);
    } else {
      console.log(`Промис ${index} провален:`, result.reason);
    }
  });
});

Альтернатива — Promise.all(), но он останавливается при первой ошибке.

Ответ 18+ 🔞

А, ну ты про это, про промисы! Да, блядь, классика — Promise.all() такой: "Ой, один сломался? Ну нахуй тогда все, я в домике!" Не, серьёзно, он на первой же ошибке весь твой красивый параллельный запуск в труху разносит. Пиздец как неудобно, если тебе ВСЕ результаты нужны, даже от тех, кто обосрался.

Так вот, есть же Promise.allSettled(), хитрая жопа! Этот чувак не паникует. Он всех дождётся — и победителей, и лузеров. Возвращает он массив, а там каждый элемент — объектик. У этого объекта два главных поля, запоминай:

  • status: тут либо "fulfilled" (ну, типа "окей, справился"), либо "rejected" (ну, "пошёл нахуй, не вышло").
  • И в зависимости от статуса — либо value (значение, если всё заебись), либо reason (причина провала, если всё пиздец).

Смотри, как это выглядит в деле, я тебе накидаю пример, чтоб совсем понятно было:

const promises = [
  Promise.resolve('Успех'),
  Promise.reject('Ошибка'),
  Promise.resolve('Ещё успех')
];

Promise.allSettled(promises).then(results => {
  results.forEach((result, index) => {
    if (result.status === 'fulfilled') {
      console.log(`Промис ${index} успешен:`, result.value); // Тут value
    } else {
      console.log(`Промис ${index} провален:`, result.reason); // А тут reason
    }
  });
});

Запустишь — и увидишь всю подноготную: кто что вернул и кто в чём обосрался. Удобно, блядь, как швейцарские часы! Так что если тебе нужно именно "всех опросить и всех послушать", а не "первый же косяк — и паника на корабле", то это твой выбор. Ёпта, вот и вся магия.