Promise.all的then回调提前执行,如何等待表格填充完成后触发
问题原因
- 核心问题是
accno.map的回调函数没有返回对应的axiosPromise实例,导致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
相关产品推荐
相关产品推荐

