Sobes.tech
Back to questions
Middle+
8

Расскажи про методы Promise: Promise.all, Promise.allSettled, Promise.race, Promise.any — чем они отличаются друг от друга?

Companies where asked
OZONOZON

Answer from AI

sobes.tech AI

Все эти методы работают с массивом промисов, но отличаются по поведению и результатам:

  • Promise.all(iterable) — ждёт, пока все промисы успешно завершатся, и возвращает массив результатов в том же порядке. Если хотя бы один промис отклоняется (reject), весь Promise.all отклоняется с этой ошибкой.

  • Promise.allSettled(iterable) — ждёт завершения всех промисов, независимо от их статуса (fulfilled или rejected). Возвращает массив объектов с полями {status: "fulfilled" | "rejected", value | reason} для каждого промиса.

  • Promise.race(iterable) — возвращает результат первого завершившегося промиса (успешного или с ошибкой). Как только один промис завершится, возвращается его результат или ошибка.

  • Promise.any(iterable) — ждёт первого успешно завершившегося промиса и возвращает его результат. Если все промисы отклоняются, возвращает AggregateError с ошибками всех промисов.

Пример:

const p1 = Promise.resolve(1);
const p2 = Promise.reject('error');
const p3 = new Promise(res => setTimeout(() => res(3), 100));

Promise.all([p1, p3])
  .then(console.log) // [1, 3]
  .catch(console.error);

Promise.allSettled([p1, p2])
  .then(console.log); // [{status: 'fulfilled', value: 1}, {status: 'rejected', reason: 'error'}]

Promise.race([p3, p1])
  .then(console.log); // 1 (p1 быстрее)

Promise.any([p2, p3])
  .then(console.log) // 3 (первый успешный)
  .catch(console.error);