Что такое метод Promise.allSettled?

Ответ

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(). Выбор за тобой, чувак.