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

如果在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})
                      }
                    })
                  })
阅读 7.1k
3 个回答
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

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

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

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

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

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

  • 可以借助 Promise.allPromise.allSettled这一类的工具
  • 自己给每个请求编个序号,响应之后,使用类似CountDownLatch的方式,等待所有请求都返回数据之后,再调用处理方法。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进