В чем разница между Promise All и Allsetted

Ответ

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. "Дождаться всех".