You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Promise.all的then回调提前执行,如何等待表格填充完成后触发

问题原因
  • 核心问题是accno.map的回调函数没有返回对应的axios Promise实例,导致Promise.all接收的是全为undefined的数组,会直接触发then回调,不会等待异步请求和表格渲染逻辑执行完成。
  • 额外问题:代码中存在多处未声明的隐式全局变量(如superset、data_combined等),可能引发数据异常。
修改方案

只要给acc对应的回调函数加上return,把axios的Promise链返回给Promise.all即可,同时补充变量声明避免全局污染,修改后的代码如下:

async function updateTable(accno, entity, start = null, funds) {
  $table.bootstrapTable('removeAll')
  // 声明变量避免隐式全局污染
  let superset = []

  return Promise.all(
    accno.map(
      // 此处添加return,把axios的Promise实例返回给Promise.all监听
      acc => {
        let conf = {
          method: 'get',
          url: 'url',
          params: {
            account_number: acc,
            start: start,
            entity: entity,
          }
        }

        return axios(conf).then(function(response) {
          let data = response.data
          // 声明局部变量
          let data_combined = []

          for (let j = 0; j < data.return.length; j++) {
            let row = data.return[j]
            let temp = {
              id: data.id,
              // 原有其他数据赋值逻辑保留
            }
            data_combined.push(temp)
          }

          // 如果你省略的其他请求逻辑也是异步操作,需要保证该逻辑也返回Promise,避免提前结束
          let fund_array = []

          tableLoadAnimation('id-table-load', 'remove-all')
          superset = [...superset, ...data_combined, ...fund_array]
          $table.bootstrapTable('load', superset)
          // 此处可返回你需要的结果,最终会聚合到Promise.all的返回数组中
          return data
        }).catch(function(error) {
          console.log(error);
          // 出错时返回错误信息可避免单个请求失败导致整个Promise.all终止
          return error
        })
      })
  ).then((a) => {
    console.log('table loaded');
    return a
  }).then((res) => {
    console.log(res, "res") // 此时会返回所有请求的结果数组,不会出现全undefined的情况
    return res
  })
}

内容的提问来源于stack exchange,提问作者Herminne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:54:00