根据 JavaScript,Node.js:Array.forEach是否异步?< /a>,Array.forEach是同步的。但是,对于下面的代码:
function wait5(){
返回新的Promise(resolve =>
setTimeout(resolve,5000));
}
异步函数main(){
console.log(“开始”);
[1,2] .forEach(async(e)=> {
const d = await wait5()。then(()=> console.log(“ 5s之后”))
})
console.log(“这应该倒数最后一次!”);
}
主要();
输出为:
开始
这应该倒数第一!
5秒后
5秒后
两个“ 5s之后”迅速出现。
为什么会这样?
如果我使用普通的 for
循环:
异步函数main(){
console.log(“开始”);
对于(让i = 0; i <2; i ++){
const d = await wait5()。then(()=> console.log(“ 5s之后”))
}
console.log(“这应该倒数最后一次!”);
}
然后结果就是我想要的:
开始
5秒后
5秒后
这应该倒数第一!
答案 0 :(得分:4)
forEach
是同步的。但是,您的回调函数不是。因此forEach
会为数组中的每个条目同步调用您的函数,该函数开始。后来,forEach
结束很久之后,开始的工作异步完成。
问题在于您的回调是async
,而不是forEach
是异步的。
通常,当您使用的forEach
之类的API对返回值不做任何事情(或不希望将promise作为返回值)时,要么:
不要将其传递给async
函数,或者
确保在函数本身内处理错误
否则,如果函数出现问题,您将得到未处理的错误。
答案 1 :(得分:1)
似乎您在调用程序中声明了一个async
函数,该函数实际上并不关心此类事情forEach
。声明一个函数async
使其类似于诺言,但是该诺言只有在执行时才有用。
如果您需要实现承诺的forEach
,尽管Promise.each
已经在Bluebird之类的库中实现了,但是您可以实现。