多JSON文件加载合并后调用tableGenerator函数异常排查
问题原因分析
你的多文件加载代码存在两个核心问题:
jQuery.when()参数错误:forEach没有返回值,你传给when()的是undefined,导致when()会立即触发后续的then回调——此时所有异步的getJSON请求还未完成,jsonData自然是空的。- 异步时序与全局变量问题:你用全局变量
jsonData收集异步请求结果,但异步回调的执行时机晚于then回调,所以tableGenerator拿到的是空数组。
修正后的代码
const fileList = ["dataFolder/data1.json", "dataFolder/data2.json", "dataFolder/data3.json"]; // 收集每个JSON文件的加载Promise,并提前提取outputs数据 const loadTasks = fileList.map(file => { return jQuery.getJSON(file).then(data => { // 容错:若文件无outputs键,返回空数组避免合并出错 return data.outputs || []; }); }); // 等待所有异步请求完成后合并数据 jQuery.when.apply(jQuery, loadTasks).then(function(...allOutputs) { // 合并所有outputs数组为一个大数组 const mergedData = allOutputs.flat(); console.log(mergedData); new tableGenerator(mergedData); });
代码优化建议
- 变量声明规范:用
const声明无需修改的变量(如fileList、loadTasks),用let声明需要修改的变量,彻底替代var——避免变量提升、全局污染等问题。 - 简化数据提取:既然明确JSON结构包含
outputs键,直接通过data.outputs访问即可,无需用jQuery.each遍历所有键,提升代码效率和可读性。 - 异步处理最佳实践:避免用全局变量存储异步结果,尽量在Promise链内部传递数据,从根源上避免时序错误。
- 容错机制完善:添加请求失败的捕获逻辑,避免单个文件加载失败导致整个流程中断:
const loadTasks = fileList.map(file => { return jQuery.getJSON(file) .then(data => data.outputs || []) .catch(err => { console.error(`加载文件 ${file} 失败:`, err); return []; // 失败时返回空数组,不影响整体合并 }); }); - 代码简洁性优化:使用箭头函数替代传统函数表达式,简化异步回调的写法;利用ES6剩余参数(
...allOutputs)和数组flat()方法,更优雅地合并结果。 - 避免冗余代码:删除不必要的分号(如原代码中
if语句后的分号),保持代码风格一致。
内容的提问来源于stack exchange,提问作者Jfreixa
相关产品推荐
相关产品推荐

