forEach遍历await异步函数,不能同步拿到数据。踩坑记录!!!!!
一直困惑我好久的一个难题:由于项目需求,我需要在循环中调用一个await 异步函数(调接口),我起初用的forEach,我的诉求是所有循环汇总的await异步函数都执行完毕,拿到所有await返回的数据,但是循环之后我拿不到所有await返回的数据。解决办法: 弃用forEach改用for循环,下面就可以同步拿到数据,只要你for循环里面代码块的代码是同步代码,那么每一次的for循环就会同步执行,
·
一直困惑我好久的一个难题:由于项目需求,我需要在循环中调用一个await 异步函数(调接口),我起初用的forEach,我的诉求是所有循环汇总的await异步函数都执行完毕,拿到所有await返回的数据,但是循环之后我拿不到所有await返回的数据。这个问题困扰我了很久,起初想到用promise.all但是这个api需要将多个接收await的变量放入数组当做promise.all的参数。但是这个await异步函数调用的次数不是个固定数量,所以也不行。
解决办法: 弃用forEach改用for循环,下面就可以同步拿到数据,只要你for循环里面代码块的代码是同步代码,那么每一次的for循环就会同步执行,直到for循环的所有遍历次数执行完毕,才会执行for循环之后的代码。那就很nice!终于解决了问题,由于没时间粘贴代码,所以暂时用文字记录。
原理应该是foreach内部封装了while,循环并行执行,而且并行执行数组的所有callback函数,不会等待里面的callback的返回。
有两种批量处理异步方式:
-
for循环
-
promise.all+map
//promise.all+map
const arr = [1, 2, 3];
const asyncRes = await Promise.all(arr.map(async (i) => {
let res =await sleep(10);
return res
}));
console.log(asyncRes);
// 2,3,4
更多推荐




所有评论(0)