当async/await遇上forEach

for和forEach的差别是后者不能正常的跳出循环(return、break等),其它的差别不大,把forEach转成for的写法就知道为什么你的for写法可以顺序执行而forEach不能:


for:

const report = async () => {
    for (let i = 0, len = arr.length; i < len; i++) {
        await asyncFn(arr[i]);
    }
};


forEach:

const report = async () => {
    arr.forEach(async (item) => {
        await asyncFn(item);
    });
};


上述forEach的写法相当于:

const report = async () => {
    const asyncFnWrap = async (item) => {
      await asyncFn(item);
    };
    for (let i = 0, len = arr.length; i < len; i++) {
        asyncFnWrap(arr[i], i);
    }
};

第一个for循环的 asyncFn 要wait返回后才继续执行,所以是顺序执行,而第二个的 asyncFnWrap 不会阻塞循环。



实际上还是forEach内部实现不支持await的问题




参考:

https://imweb.io/topic/5b3b7d624d378e703a4f4437

真诚赞赏,手留余香
赞赏
随机推荐
macOS 文字转语音命令 say
Windows 和 macOS 上使用ffmpeg 进行视频切片
重写了自己的 Node.js 爬虫
使用FormData无刷新上传文件
RESTful就是个骗局 (蛤蛤)
使用Cordova命令行界面(CLI)
Naxsi 白名单设置
Nodejs路由实现方式和顺序
javascript获取当前时间
Vue 3.0 快速教程