vue 循环调用接口赋值问题

vue 循环调用接口赋值问题
循环调接口的时候,里面赋值的数组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)

})

}

}


回答:

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);

}

}

以上是 vue 循环调用接口赋值问题 的全部内容, 来源链接: utcz.com/p/937548.html

回到顶部