← Назад ко всем вопросам

В чем разница между Promise.all и Promise.any

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

Promise.all и Promise.any — это методы, которые позволяют работать с множеством промисов одновременно, но они имеют разные подходы к обработке результатов и ошибок.

Promise.all

Promise.all принимает массив промисов и возвращает новый промис. Этот промис:

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

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

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});
​
Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values); // [3, 42, "foo"]
}).catch((error) => {
  console.error(error);
});
  • promise1 и promise2 разрешаются сразу.
  • promise3 разрешается через 100 миллисекунд.
  • Promise.all ждет завершения всех промисов и возвращает их результаты в массиве.

Promise.any

Promise.any также принимает массив промисов и возвращает новый промис. Этот промис:

  • Разрешается, когда любой из переданных промисов успешно завершен. Он возвращает результат первого успешно завершенного промиса.
  • Отклоняется, если все промисы отклонены. В этом случае он возвращает AggregateError, содержащий все причины отклонения.

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

const promise1 = Promise.reject('Error 1');
const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'Success');
});
const promise3 = Promise.reject('Error 3');
​
Promise.any([promise1, promise2, promise3]).then((value) => {
  console.log(value); // "Success"
}).catch((error) => {
  console.error(error);
});
  • promise1 и promise3 отклоняются сразу.
  • promise2 разрешается через 100 миллисекунд.
  • Promise.any возвращает результат promise2, так как это первый успешно завершенный промис.

Зачем это нужно и где применяется

  • Promise.all полезен, когда необходимо дождаться завершения всех операций, например, загрузки нескольких ресурсов, перед тем как продолжить выполнение программы.
  • Promise.any подходит для случаев, когда достаточно получить первый успешный результат, например, при обращении к нескольким зеркалам сервера для получения данных.

Оба метода помогают управлять асинхронными операциями, делая код более читаемым и управляемым.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки