forEach处理异步任务遇到的坑

前言

在forEach处理了异步,但是始终不能顺序执行,至此想要的数据怎么都拿不到,绞尽脑汁,也不知道问题发生在哪里。此篇文章我们就来探究下forEach循环下处理异步会发生什么样的情况。


探索

  • 创建一个异步函数
const promiseTasek = (num) => {
    return new Promise((resolve, reject) => {
        setTimeout(()=>{
            console.log(num)
            resolve(true)
        },3000)
    })
}
  • 先看一段简单的forEach处理异步的代码
// 等待 3 秒 直接输出1 2 3 4 5 6
function toTaskByForEach() {
    const arr = [1,2,3]
    arr.forEach(async item => {
        await promiseTasek(item)
    })
}
toTaskByForEach()

执行结果 注意执行输出的变化,他会**直接打印**出1,2,3在这里插入图片描述

  • 我们尝试换一种循环for of 看一下效果对比一下
async function toTaskByForOf() {
    const arr = [1,2,3,4,5,6]
    for (let item of arr){
        await promiseTasek(item)
    }
}
toTaskByForOf()

来看下执行结果 他会按**顺序执行**依次打印出1,2,3
在这里插入图片描述

结论

forEach 不会按顺序执行 而是并发执行异步任务
for of 和 普通的for循环却能顺序执行异步任务

解密: forEach为什么是并发执行

在 tc39的文档中 第五点 说明 **foreach 会用 while循环 判断当前的索引是否小于数组的length,如果小于会一直执行下去不会等待异步任务执行完成**。
所以这就解释通了forEach为什么直接输出1,2,3了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值