Sobes.tech
Назад к вопросам
Junior — Middle
72

Каким образом осуществляется одновременное выполнение нескольких промисов с помощью Promise.all и как обрабатываются их результаты?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Promise.all запускает несколько промисов параллельно и ждёт, пока завершатся все. Результат возвращается одним массивом в том же порядке, в котором промисы были переданы, а не в порядке их фактического завершения. Если хотя бы один промис отклоняется, весь Promise.all сразу переходит в rejected.

Определение:

Promise.all — это метод, который принимает массив промисов и возвращает новый промис. Он успешно завершается только тогда, когда успешно завершились все переданные промисы. В случае ошибки хотя бы одного из них итоговый промис считается отклонённым, и ошибка пробрасывается дальше.

Пример использования:

const promise1 = fetch('/api/user').then(r => r.json());
const promise2 = fetch('/api/orders').then(r => r.json());
const promise3 = fetch('/api/settings').then(r => r.json());

Promise.all([promise1, promise2, promise3])
  .then(([user, orders, settings]) => {
    console.log(user);
    console.log(orders);
    console.log(settings);
  })
  .catch(error => {
    console.error('Одна из операций завершилась с ошибкой:', error);
  });

Пояснение кода:

Код не требуется — достаточно понимать логику работы.

  1. Создаются три независимые асинхронные операции.
  2. Promise.all принимает их в массиве и начинает ожидание всех сразу.
  3. Если все три успешно завершаются, then получает массив результатов в исходном порядке: сначала user, потом orders, потом settings.
  4. Если любой fetch или then(r => r.json()) завершится ошибкой, управление перейдёт в catch.
  5. Даже если один запрос выполнился быстрее остальных, порядок результатов в массиве не меняется.

Ключевые моменты:

  • Promise.all ждёт завершения всех переданных промисов.
  • Результаты возвращаются строго в порядке входного массива.
  • При первой ошибке весь Promise.all отклоняется.
  • Метод подходит, когда нужны все результаты одновременно.
  • Если нужен сбор результатов даже при частичных ошибках, обычно рассматривают Promise.allSettled.