Обещание, прикрепленное с помощью .then() в Promise.all()

#javascript #asynchronous #promise #es6-promise

#javascript #асинхронный #обещание #es6-обещание

Вопрос:

Я смущен разрешением обещаний. Если я создал массив обещаний и предоставил .then() для всех из них, как показано ниже..

 // assume async() returns a promise that resolves with the number 5. 
promiseArray = [];
for (let i = 0; i < 5; i  ){
promiseArray.push(async(5).then(() => console.log("done")));
}
Promise.all(promiseArray).then(() => console.log("all done"));
  

Я в замешательстве от того, что здесь происходит. Запускают ли обещания ведение журнала консоли «готово» еще до завершения Promise.all() ? Является ли .then() для Promise.all() отдельным .then(), который будет выполняться только после разрешения всех обещаний?

В чем разница в удалении .then() из всех отдельных обещаний и вместо этого выполнении этого кода в .then() Promise.all(), как показано ниже? Есть ли какой-либо компромисс в производительности?

 // assume async() returns a promise that resolves with the number 5. 
promiseArray = [];
for (let i = 0; i < 5; i  ){
promiseArray.push(async(5));
}
Promise.all(promiseArray).then((resolves) => resolves.forEach(console.log("done")));
  

Комментарии:

1. Что это за async функция?

2. Я отредактировал сообщение, но просто говорю, что async возвращает обещание, которое разрешается с числом 5. Это всего лишь гипотетический пример.

3. если вас смущает разрешение обещаний , это задокументировано: процедура разрешения обещаний

Ответ №1:

Запускают ли обещания ведение журнала консоли «готово» еще до завершения Promise.all() ? Является ли .then() для Promise.all() отдельным .then(), который будет выполняться только после разрешения всех обещаний?

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

В чем разница в удалении .then() из всех отдельных обещаний и вместо этого выполнении этого кода в .then() Promise.all(), как показано ниже? Есть ли какой-либо компромисс в производительности?

Основное отличие заключается в том, что в первом подходе done s могут регистрироваться, как только их предыдущее обещание завершено. Напротив, во втором подходе:

 Promise.all(promiseArray).then((resolves) => resolves.forEach(
  

Выше все обещания должны быть разрешены, прежде чем начинать повторять их снова.

Это вполне может быть существенным фактором. Например, допустим, вам нужно выполнить вычисление с интенсивным использованием процессора для каждого результата Promise . В таком случае использование второго подхода, безусловно, было бы лучшим выбором, потому что тогда вы можете выполнять некоторые из этих вычислений, ожидая разрешения других обещаний, вместо того, чтобы ждать разрешения всех обещаний перед началом первого вычисления.

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

(Если код, который будет выполняться после отдельных обещаний, не является дорогостоящим, тогда это не имеет значения — вы можете выбрать любой подход, который вы считаете наиболее читаемым)

Комментарии:

1. Для вашего примера вы хотели сказать, что первый подход является улучшением по сравнению со вторым ?

2. Опечатка, вы правы. Привязка к отдельному обещанию, когда это возможно, не привязывайте к Promise.all