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

代码拆分为多函数后返回空数组的问题求助

拆分函数后返回空数组的问题排查与修复

核心问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:20:30