Когда вы делаете count += await <expression>
, начальное значение count
, добавляемое к значению разрешения, сохраняется до того, как часть await
будет разрешена. Так
count += await returnNumberAsync(number)
похоже на
count = count + await returnNumberAsync(number)
как видите:
(async function iife () {
const numbers = [1, 2, 3, 4]
let count = 0
async function returnNumberAsync (number) {
return new Promise(resolve => {
setTimeout(() => resolve(number), 0)
})
}
await Promise.all(numbers.map(async number => {
count = count + await returnNumberAsync(number)
}))
console.log(count)
})()
В каждом из 4 замыканий count
считается равным 0 до разрешения await
с, поэтому только в последней микрозадаче await
, где оно разрешается до
count += await returnNumberAsync(4)
// or
count = 0 + await returnNumberAsync(4)
// or
count = 4
делает 4
назначенным на count
. Тот факт, что другие номера были присвоены count
ранее, игнорируется. Они произошли, но назначение последней итерации - это все, что вы видите в текущем коде.