js循环中调接口,返回值的顺序问题

发布于 2022-09-12 04:31:25 字数 1137 浏览 30 评论 0

如果在js的循环中调接口,因为接口请求的数据响应时间不一样,所以接口返回值有快有慢,但是用什么方法可以保证返回的数据接顺序返回呢???
下面是代码
response.data.valueList.map是数组值,循环调接口拿值。


response.data.valueList.map(m=>{
                    let query={page:1,limit:500,attributeId:m.attributeId}
                    goodsModule.attrList(query).then(response=>{
                      if(response.code===0){
                        console.log(response.data)
                        response.data.list.map(n=>{
                          if(n.attributeValueId===m.attributeValueId){
                            m.attributeValueName=n.value
                          }
                        })
                        this.specsListCopy.push({specsDefault:m.attributeId,attributeList:response.data.list,attributeValue:m.attributeValueId,attributeValueName:m.attributeValueName})
                      }else{
                        response.data.list=[]
                        this.specsListCopy.push({specsDefault:m.attributeId,attributeList:response.data.list,attributeValue:m.attributeValueId})
                      }
                    })
                  })

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

阳光的暖冬 2022-09-19 04:31:25
Promise.all(
  response.data.valueList.map(m => goodsModule.attrList({page:1,limit:500,attributeId:m.attributeId}))
).then(resposeList => {
  resposeList.forEach(response => {
    if(response.code===0){
      console.log(response.data)
      response.data.list.map(n=>{
        if(n.attributeValueId===m.attributeValueId){
          m.attributeValueName=n.value
        }
      })
      this.specsListCopy.push({specsDefault:m.attributeId,attributeList:response.data.list,attributeValue:m.attributeValueId,attributeValueName:m.attributeValueName})
    }else{
      response.data.list=[]
      this.specsListCopy.push({specsDefault:m.attributeId,attributeList:response.data.list,attributeValue:m.attributeValueId})
    }
  })
})

不确定逻辑是否需要变动,还有就是如果有一个接口reject的话是不会走then的,不考虑接口的状态的话可以使用Promise.allSettled

水晶透心 2022-09-19 04:31:25

要看你循环怎么写,如果是 Async function,比如

for (....) {
  await fetch();
}

那么自然就是顺序的。或者就用 Promise.all() 也可以。

溺深海 2022-09-19 04:31:25

如果同时异步发起请求的话,数据顺序返回是没有办法保证的,除非同步请求。

但是,你可以做到数据顺序处理

  • 可以借助 Promise.allPromise.allSettled这一类的工具
  • 自己给每个请求编个序号,响应之后,使用类似CountDownLatch的方式,等待所有请求都返回数据之后,再调用处理方法。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文