今天项目中,发现在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");