代码拆分为多函数后返回空数组的问题求助
拆分函数后返回空数组的问题排查与修复
核心问题1:dataLength函数未传递有效数据
你在dataLength里创建了Promise,但调用resolve()时没传入任何值,导致await dataLength()得到的是undefined。当这个undefined传给getSubSitesIndex的length参数时,循环条件i <= length等价于i <= undefined,结果为false——循环完全没执行,dataSitesIndex自然是空数组,最终返回值也就为空。
另外你在dataLength里收集了主站点的id数组dataIndexMainId,但完全没把这个数组传递出去,这才是后续函数需要的关键数据,不是单纯的长度。
核心问题2:循环逻辑错误
就算length有有效值,getSubSitesIndex里的i <= length逻辑也不对——如果主站点数量是n,索引范围是0到n-1,用<=会多循环一次,大概率查不到对应的数据。
修复后的代码
1. 修复dataLength函数
async function dataLength(){ return new Promise((resolve, reject) => { pdo.query(`SELECT * FROM mainsites`, function(err, result) { if (err) { return reject(err); // 必须处理数据库查询错误 } // 直接提取所有主站点的id数组 const mainIds = result.map(item => item.id); resolve(mainIds); // 把id数组传给下一个函数 }) }) }
2. 修复getSubSitesIndex函数
async function getSubSitesIndex(mainIds){ let dataSitesIndex = []; // 直接遍历主站点id数组,不用靠长度循环 for(const mainId of mainIds){ await new Promise((resolve, reject) => { pdo.query("SELECT * FROM subsites WHERE main = ?", [mainId], function(err, result) { if (err) { return reject(err); } dataSitesIndex.push(result); // 直接push结果,避免索引错位 resolve(); }) }) } // 过滤掉空的查询结果(如果有的话) const filterDataSitesIndex = dataSitesIndex.filter(item => item.length > 0); console.log(filterDataSitesIndex); return filterDataSitesIndex; }
3. 修复执行逻辑
现在dataLength返回的是id数组,不是长度,执行代码需要调整:
async function run() { try { const mainIds = await dataLength(); const subSites = await getSubSitesIndex(mainIds); const finalResult = await getIndex(subSites); console.log("最终结果:", finalResult); } catch (err) { console.error("执行出错:", err); } } run();
额外建议
- 可以把pdo的回调式查询封装成通用的Promise函数,避免每个查询都手动写Promise包裹;
- 所有数据库查询都要处理
err,否则错误会被悄悄吞掉,很难排查问题。
内容的提问来源于stack exchange,提问作者NowUserID
相关产品推荐
相关产品推荐

