Задать вопрос
jeerjmin
@jeerjmin

Это параллельное выполнение промиссов?

Есть два промиса

const promise1 = new Promise(...)
const promise2 = new Promise(...)


Я хочу выполнить их параллельно, что можете сказать о разнице между этими двумя методами, будет ли выполнение параллельным в первом методе ?

const [result1, result2] = [await promise1, await promise2]


ИЛИ

const [result1, result2] = Promise.all([promise1, promise2])
  • Вопрос задан
  • 620 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 3
rockon404
@rockon404
Frontend Developer
будет ли выполнение параллельным в первом методе ?

В вашем коде параллельное выполнение осуществляется за счет вызовов:
const promise1 = new Promise(...)
const promise2 = new Promise(...)

так как Promise начинают выполнение функции экзекутора сразу после создания.

Но библиотеки основанные на Promise так не работают, они обычно возвращают Promise на определенный вызов:
const someCall = (...someArgs) => new Promise((resolve, reject) => { /* ... */ });

В таком случае:
// последовательный вызов 
const [result1, result2] = [await someCall(), await someOtherCall()];

// параллельный вызов
const [result1, result2] = Promise.all([someCall(), someOtherCall()]);
Ответ написан
Lynn
@Lynn
nginx, js, css
В обоих случаях параллельно, т.к. вы создали промизы до await-ов.
Разница будет в случае если промисы будут реджектится. Например, если первый резолвится через секунду, а второй реджектится мгновенно, то в первом случае вы сначала дождётесь выполнение первого промиза, а во втором случае Promise.all сразу зареджектится.
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
В чём была проблема найти ответ на свой вопрос самостоятельно? Создаёте промисы, которые будут резолвиться через определённый промежуток времени, и смотрите, сколько пройдёт до получения результата в обоих случаях:

const getNum = () => new Promise(r => setTimeout(r, 1000, Math.random() * 100 | 0));

(async () => {
  console.time('xxx');
  const [ result1, result2 ] = [ await getNum(), await getNum() ];
  console.log(result1, result2);
  console.timeEnd('xxx');
})();

(async () => {
  console.time('yyy');
  const [ result1, result2 ] = await Promise.all([ getNum(), getNum() ]);
  console.log(result1, result2);
  console.timeEnd('yyy');
})();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы