forEach和for包含异步调用的区别

本文探讨了for循环和forEach在处理异步调用时的不同行为。for循环等待每个异步操作完成,而forEach则立即执行后续代码,可能导致结果顺序混乱。建议在涉及异步操作且依赖结果顺序时使用for循环。

作为for循环的增强版,forEach在遍历数组时书写更简洁、可读性也更强。但是当循环中包含异步操作时可能会遇一些坑。下面看看两者异步调用时的一些区别:

promise setTimeOut模拟异步

async function log(info) {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(() => {
        resolve(`info is ${info}`)
      }, 100)
    } catch (err) {
      reject (err)
    }
  })
}

for循环调用异步

async function funFor () {
  for (let i = 0; i < 3; i ++) {
    const res = await log('for ' + i)
    console.log(res)
  }
  console.log('for is completed...')
}
funFro() // 调用
/*
结果: 
	info is for 0
	info is for 1
	info is for 2
	for is finish...
*/

forEach调用异步

async function funForEach () {
  [1, 2, 3].forEach(async (i) => {
    const res  = await log('forEach ' + i)
    console.log(res)
  })
  console.log('forEach is completed...')
}
funForEach() // 调用
/*
结果:
	forEach is finish...
	info is forEach 1
	info is forEach 2
	info is forEach 3
*/

比较

  • for循环中包含异步调用时会等异步调用完成后再执行后面的语句(先输出1、2、3最后输出completed)
  • forEach中包含异步调用时会直接执行后面的语句(先输出completed,然后输出1、2、3)

结论

  • 如果循环中包含了异步调用、并且循环后的同步操作调用了遍历后的结果,应该使用for循环代替forEach
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值