根据JavaScript,Node.js:Array.forEach是异步的吗?,Array.forEach是同步的。但是,对于下面的代码:
function wait5() {
return new Promise(resolve =>
setTimeout(resolve, 5000));
}
async function main() {
console.log("Start");
[1,2].forEach(async (e) => {
const d = await wait5().then(()=> console.log("5s later") )
})
console.log("This should come last!");
}
main();
Run Code Online (Sandbox Code Playgroud)
输出为:
Start
This should come last!
5s later
5s later
Run Code Online (Sandbox Code Playgroud)
两个“ 5s之后”迅速相继问世。
为什么会这样呢?
如果我使用普通for循环:
async function main() {
console.log("Start");
for (let i=0;i<2;i++) {
const d = await wait5().then(()=> console.log("5s later") )
}
console.log("This should come last!");
}
Run Code Online (Sandbox Code Playgroud)
那么结果就是我想要的:
Start
5s later
5s later
This should come last!
Run Code Online (Sandbox Code Playgroud)
forEach是同步的。但是,您的特定回调函数不是。因此,对于数组中的每个条目,forEach同步调用一次函数,以开始其工作。后来,开始的工作异步地完成了,很久之后forEach又回来了。
问题是您的回调是async,而不是forEach异步的。
通常,当您使用类似的API时forEach,对返回值不做任何事情(或者不希望将promise作为返回值),或者:
不要将其传递给async函数,或者
确保在函数本身内处理错误
否则,如果函数中出现问题,您将得到未处理的错误。
或者,当然:
try/ catch块async可捕获和处理/报告函数本身内的错误。| 归档时间: |
|
| 查看次数: |
3104 次 |
| 最近记录: |