今天看到mdn上关于数组的foreach方法,有这样一段示例
let ratings = [5, 4, 5];
let sum = 0;
let sumFunction = async function (a, b) {
return a + b;
}
ratings.forEach(async function(rating) {
sum = await sumFunction(sum, rating);
})
console.log(sum);
// Expected output: 14
// Actual output: 0
mdn说导致这种结果的原因和执行顺序有关,我想了很久也不能理解 就自己试着log了一些,以下是我的截图,我觉得执行顺序并没问题啊,为什么sum每次都是0呢,为什么没有串行而是并行执行了呢?
打上 tag、再换组不同的数,可能更容易理解一下执行顺序:
可能你被
async
/await
迷惑住了,以为每次 forEach 循环是串行的。实际它就是个语法糖而已,只是在 Function 内阻塞等待 Promise 执行完,但并不意味着会阻塞整个 forEach 的 callback。如果去掉这个语法糖,它实际等效于:而你理解的所谓“串行”,实际应该写成: