谈forEach中使用async await踩坑

场景:

如果我们在程序中,需要遍历数组,针对每一项发起一个异步请求,而这些请求具有明确的先后顺序。即上一次请求完成,才能发起下一次请求,那么应该怎么实现?

一种很容易想到的方式是:使用forEach遍历,针对数组的每一项,发起一次请求。

对于forEach的回调函数,声明为异步函数(async),在里面使用await。

 let arr = [1, 2, 3, 4];
 await arr.forEach(async item => {
  const res = await fetch(item)
  // ...
 })

forEach的问题

假使我们使用forEach,那么我们会发现结果并不符合预期。我们的请求的响应并非按我们预期的顺序进行,会出现顺序错乱现象。那么原因何在?

原因是forEach遍历,仅仅是短时间内连续发起了多个请求,对于某一次请求有等待过程,但对于整体的多次请求是没有作用的。

也就是async await仅仅作用于某一次请求的处理过程中,并不作用于所有请求的先后顺序。

推荐的写法——for of

  虽然使用forEach无法得到想要的结果,但我们只需要改用for of即可。

 let arr = [1, 2, 3 ,4]
 for(let i of arr){
   const res = await fetch(arr[i]); 
   //...          
 }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值