vue 循环调用接口赋值问题

image.png
循环调接口的时候,里面赋值的数组tableData在外面拿不到,然后想修改成等待所有接口都返回200 的时候再赋值,应该如何修改,感谢各位

if (this.checkHelpData.length > 1) {
          var str = ''
          var totalAmout = ''
          this.checkHelpData.forEach(async (item) => {
            let res = await getOrderInfo(item.id)
            if (res.status === 200 && item.orderStatusName === '已完成') {       
                res.data.salesOrderItemsList.forEach((row) => {
                  this.tableData.push(row)
                })
              }
}
阅读 4k
2 个回答

forEach、map等是不支持异步函数的,但是for循环支持,所以可以改成for循环,改动最小。整体返回的话可以使用Promise.all

Promise.all(this.checkHelpData.map(item => getOrderInfo(item.id))).then(datas => {
    console.log(datas)
})

.forEach() 本身不支持异步按顺序执行。在不关心顺序的情况下,原来的代码没有问题,只是要等所有异步完成。可以把 forEach() 改成 map() 拿到每一个异步的 promise,然后用 Promise.all() 来等待全部完成。

const promises = this.checkHelpData.map(async (item) => {
    let res = await getOrderInfo(item.id)
    if (res.status === 200 && item.orderStatusName === '已完成') {
        res.data.salesOrderItemsList.forEach((row) => {
            this.tableData.push(row)
        })
    }
});

await Promise.all(promises);

如果关心顺序,那就不应该每拿到一个结果就立即时间处理(因为拿到结果的顺序不确定),而是应该把这个结果放到外面 Promise.all 结束之后再来处理

const promises = this.checkHelpData.map(item => getOrderInfo(item.id));

const allResults = await Promise.all(promises);
this.tableData = allResults
    .filter(res.status === 200 && item.orderStatusName === '已完成')
    .map(res.data.salesOrderItemsList.flat());
// 上面,如果不是要刷新 tableData,就应该用 tableData.push(...allResult.filter(..).map(...))

如果不希望有一个不成功就中断,Promise.all 就要改用 Promise.allSettled。

如果为了减少服务器压力,不希望一次性把所有请求发出去,而是一次一次的发,就用 for 或者 for .. of

for (const item of this.checkHelpData) {
    const res = await getOrderInfo(item.id);
    if (res.status === 200 && item.orderStatusName === '已完成') {
        this.tableData.push(...res.data.salesOrderItemsList);
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题