Array.forEach是异步的吗?

Old*_*zer 2 javascript

根据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)

T.J*_*der 5

forEach是同步的。但是,您的特定回调函数不是。因此,对于数组中的每个条目,forEach同步调用一次函数,以开始其工作。后来,开始的工作异步地完成了,很久之后forEach又回来了。

问题是您的回调是async,而不是forEach异步的。

通常,当您使用类似的API时forEach,对返回值不做任何事情(或者不希望将promise作为返回值),或者:

  1. 不要将其传递给async函数,或者

  2. 确保在函数本身内处理错误

否则,如果函数中出现问题,您将得到未处理的错误。

或者,当然:

  1. 在函数内使用try/ catchasync可捕获和处理/报告函数本身内的错误。