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

«Что такое метод Promise.allSettled?» — вопрос из категории Асинхронность, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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).