今天项目中,发现在map循环使用了await,并未生效,循环体后代码优先执行了的问题。

a.map(async (item) => {
  await function_a();
  console.log("a");
})
console.log("b");

 结果输出了

b
a

具体原理是,可能map/forEach内部使用了while结合callback方式来执行函数,await不会等待callback的执行。

   所以解决方式有两种:

 1.使用Promise.all来包裹执行 

await Promise.all(a.map(async (item) => {
  await function_a();
  console.log("a");
}));
console.log("b");

 2.使用传统的for来执行

for(let i = 0 ; i < a.length ; i++){
  await function_a();
  console.log("a");
}
console.log("b");