Объясните разницу между последовательным и параллельным выполнением асинхронных функций. Как работают Promise.all() и Promise.allSettled()?

Этот вопрос проверяет знание основ параллельного и последовательного выполнения асинхронных задач, а также знакомство с методами работы с несколькими Promise.

Короткий ответ

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

Длинный ответ

Асинхронные функции могут выполняться как последовательно, так и параллельно:

 

Последовательное выполнение:
При последовательном выполнении каждый промис или асинхронная операция начинается только после того, как завершилась предыдущая:

async function runSequentially() {
  await task1();  
  await task2();  
  await task3(); 
}

В этом примере task2 запустится только после того, как завершится task1, и так далее. Это полезно, когда задачи зависят друг от друга.

 

Параллельное выполнение:
Параллельное выполнение позволяет запустить несколько задач одновременно:

async function runInParallel() {
  await Promise.all([task1(), task2(), task3()]); 
}

Здесь все три задачи начнутся одновременно, что может значительно сократить общее время выполнения, если задачи независимы.

 

Работа Promise.all():
Метод Promise.all() принимает массив промисов и возвращает новый Promise, который выполнится, когда все промисы завершатся успешно. Если один из промисов завершится с ошибкой, весь Promise.all() завершится с ошибкой.

Promise.all([fetchData1(), fetchData2()])  
	.then(results => console.log(results))  
	.catch(error => console.log(error));

Работа Promise.allSettled():
Promise.allSettled() ждёт завершения всех промисов, независимо от того, завершились они успешно или с ошибкой. Это полезно, когда нужно обрабатывать все результаты, даже если некоторые задачи завершились с ошибкой:

Promise.allSettled([fetchData1(), fetchData2()])  
	.then(results => console.log(results));

Каждый результат в массиве будет объектом с полем status (успех или ошибка) и значением или ошибкой.

 

Использование параллельного выполнения может значительно ускорить работу программы, особенно когда задачи не зависят друг от друга.

Уровень

  • Рейтинг:

    3

  • Сложность:

    7

Навыки

  • JavaScript

    JavaScript

Ключевые слова

Подпишись на React Developer в телеграм