let sum = 0
const arr = [1, 2, 3]
async function sumFn(a, b) {
return a + b
}
// 为了方便后续修正改造,将 forEach 逻辑放到函数 main 中执行了。
function main(array) {
array.forEach(async item => {
sum = await sumFn(sum, item)
})
console.log(sum) // 0, Why?
}
main(arr)
let sum = 0
const arr = [1, 2, 3]
async function sumFn(a, b) {
return a + b
}
// await 要放在 async 函数中
async function main(array) {
for (let item of array) {
sum = await sumFn(sum, item)
}
console.log(sum) // 6
}
main(arr)
这样就能输出预期结果 6 了。
那为什么 for...of 就可以呢?因为它本质上就是一个 while 循环。
let sum = 0
const arr = [1, 2, 3]
async function sumFn(a, b) {
return a + b
}
// await 要放在 async 函数中
async function main(array) {
// for (let item of array) {
// sum = await sumFn(sum, item)
// }
// 相当于
const iterator = array[Symbol.iterator]()
let iteratorResult = iterator.next()
while (!iteratorResult.done) {
sum = await sumFn(sum, iteratorResult.value)
iteratorResult = iterator.next()
}
console.log(sum) // 6
}
main(arr)
在上一篇文章【for 语句详解】提到了在循环中应用 async/await 的例子。
于是,顺道提一下在
Array.prototype.forEach()
使用async/await
的问题。其实,在 MDN 上就有提醒:示例:
为什么
sum
打印结果是0
,而不是预期的6
呢?当代码执行到
forEach
时:所以,在
forEach
中使用async/await
可能没办法到达预期目的哦。如何解决以上问题呢?
我们可以使用 for...of 来替代:
这样就能输出预期结果
6
了。那为什么
for...of
就可以呢?因为它本质上就是一个while
循环。只要了解了
async/await
和for...of
的内部运行机制,分析起来就不难了。The end.