前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为啥await在forEach中不生效?

为啥await在forEach中不生效?

作者头像
用户3258338
发布2019-10-29 16:04:58
2.4K0
发布2019-10-29 16:04:58
举报

1024节快乐~


前两天要写循环遍历请求接口,于是就在forEach中用到了await,但是根本不是我想要的啊!

于是各种查,各种搜,终于有点明白了。先看段代码:

代码语言:javascript
复制
function test(){
  let arr =[3,2,1]
  arr.forEach(async item=>{
    const res = await fetch(item)    
    console.log("end")
  })
}

function fetch(x){
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      revolve(x)
    }, 500*x)
  })
}

test();

期望打印出来顺序是:

代码语言:javascript
复制
3
2
1
end

然而打印顺序确实

代码语言:javascript
复制
end
1
2
3

原因是forEach只支持同步代码

Pollyfill版本的forEach,简化以后类似于下面的伪代码:

代码语言:javascript
复制
while(index < arr.length){
  callback(item, index)
}

forEach只是简单的执行下回调函数,并不会处理异步的情况。

解决办法

方法一:Promise.all

代码语言:javascript
复制
async function test(){
  let arr = [3,2,1]
  await Promise.all(arr.map(async item=>{
    const res = await fetch(item);
    console.log(res)
  }))
  console.log("end")
}

async函数肯定会返回一个Promise对象,map返回一个存放Promise的数组。但是这样并不能保证fetch是按顺序完成的,如果想按顺序,请用下面的方法。

方法一:for ... of

代码语言:javascript
复制
async function test(){
  let arr =[3,2,1];
  for(const item of arr){
    const res = await fetch(item);
    console.log (res)
  }
  console.log("end")
}

因为for... of和forEach内部的机制不同,forEach是直接调用回调函数,for...of 是通过迭代器的方式去遍历的:

代码语言:javascript
复制
async function test(){
  let arr = [3,2,1];
  const iterator = arr[Symbol.iterator]()
  let res = iterator.next()
  while(!res.done){
    const value = res.value;
    const res1 = await fetch(value);
    console.log(res1);
    res.iterator.next();
  }
  console.log("end")
}

以上代码等价于for...of

参考文章:https://yuchengkai.cn/blog/2019-04-01.html#%E6%80%8E%E4%B9%88%E8%A7%A3%E5%86%B3%EF%BC%9F

愿我们有能力不向生活缴械投降---Lin

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 女程序员的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档