如果循环里面嵌套异步,然后异步里面嵌套循环,然后循环里面再嵌套异步,然后异步里面拿到表格(tabel)行(row)数据,那么请问,怎么逆向操作,将rowData拼装成tableData再拼装成sheetsData?
昨天本人在做一个导出功能的时候,就遇到这个问题。一开始,怎么尝试,都无法解决同步与异步的问题,所以无法拼装成功。后来想到了Promise.all(),问题才迎刃而解。
以下是实现代码:
- 封装返回单行(row)数据的方法
async getRowdata(subId, name, orgId) {
const res = await getCountData(subId, orgId)
if (res && res.code === 200) {
if (res.data) {
const e = res.data
e.id = subId
e.name = name
return e
} else {
return null
}
} else {
this.$message.warning(res.msg || '数据请求失败')
return null
}
},
- 封装返回单个表格(table)数据的方法
async getTableData(orgId) {
const res = await getSubstList({ orgId: orgId })
if (res && res.code === 200) {
if (res.data && res.data.length) {
const promise = res.data.map(item => {
return new Promise((resolve, reject) => {
this.getRowdata(item.id, item.name, orgId).then(res => {
resolve(res)
})
})
})
const tempData = await Promise.all(promise)
const tableData = tempData.filter(item => { return !!item })
if (tableData && tableData.length) {
return Promise.all(promise)
} else {
return null
}
} else {
return null
}
} else {
this.$message.warning(res.msg || '数据请求失败')
return null
}
},
- 封装返回多个表格(sheets)数据的方法
getSheetsData() {
const promise = this.tabOpts.map(item => {
return new Promise((resolve, reject) => {
this.getTableData(item.id).then(res => {
resolve(res)
})
})
})
return Promise.all(promise)
},
Promise.all() ,将一组 promises 聚合,最终可以返回由所有promises完成结果组成的数组,这种特性在处理循环+异步的时候非常方便。
以往项目中,没有用过Promise.all(),导致把它都遗忘了,这次重新用上,发现真香。相信经过这次,再也不会忘了...