Что такое Promise.all?
Метод Promise.all представляет собой мощный инструмент для параллельного выполнения нескольких асинхронных операций в JavaScript. Синтаксически он принимает итерируемый объект, чаще всего массив, содержащий промисы, например, в виде конструкции Promise.all([p1, p2, p3]), и запускает их одновременно, а не последовательно. Это кардинально повышает производительность приложений, когда вам нужно запросить независимые данные из нескольких источников.
Главная особенность этого метода заключается в том, что он ждёт все promises перед тем, как продолжить выполнение дальнейшего кода. Когда каждый из переданных промисов успешно завершается, метод возвращает массив результатов, где каждый элемент соответствует результату выполнения исходного промиса в том же порядке, в котором они были переданы во входной массив. Это очень удобно для деструктуризации полученных данных, например, при одновременной загрузке профиля пользователя, списка его заказов и настроек интерфейса.
Тем не менее, у данного подхода есть критическая особенность, которую необходимо учитывать при проектировании архитектуры: он отклоняется при первой ошибке. Если хотя бы один из промисов в массиве завершится с ошибкой (перейдет в состояние rejected), весь Promise.all немедленно прекращает ожидание остальных и возвращает эту ошибку. Остальные промисы при этом продолжают выполняться в фоновом режиме, но их результаты будут проигноированы. Поэтому Promise.all идеально подходит для задач, где все запросы критически важны для работы экрана, и частичный успех не имеет смысла.