Promise.all()的真香实践

557 阅读1分钟

如果循环里面嵌套异步,然后异步里面嵌套循环,然后循环里面再嵌套异步,然后异步里面拿到表格(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(),导致把它都遗忘了,这次重新用上,发现真香。相信经过这次,再也不会忘了...