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

Node.js请求回调函数中array.push()方法不生效问题求助

问题根因:异步请求执行顺序问题

request 属于异步IO操作,你传入的回调函数不会同步执行,而是会等网络请求完成后才会被调度执行。你当前代码的实际执行顺序为:

  1. 初始化 locationArray 空数组
  2. 发起request网络请求,注册好回调函数后直接继续向下执行后续代码
  3. 执行 locationArray.push("test") 写入测试内容
  4. 执行 console.log(locationArray),此时数组内只有刚写入的test值
  5. 等网络请求成功返回后,才会执行回调内的逻辑,往数组内写入爬取到的level内容,此时你已经完成了数组打印操作,所以看不到回调内写入的内容。
解决方案

有两种常用的处理方案,可根据你的项目场景选择:

1. 把依赖完整数组的逻辑放到回调内部

将需要用到完整locationArray的逻辑都放到request回调的末尾,保证所有数据写入完成后再执行后续操作:

var locationArray = new Array();

request(process.env.RESOURCE_SHEET, (error, response, html) => {
    if(!error && response.statusCode == 200) {
        const $ = cheerio.load(html);
        $("h3").each((i, lle) => {
            const location = $(lle).text();
            if(location.includes("Kansas")) return;
            const level = location.includes("In Stock") ? location + " ✅" : location + " ❌";
            locationArray.push(level);
        });
        // 所有数据写入完成后再操作数组
        locationArray.push("test");
        console.log(locationArray); // 此时可以看到所有写入的内容
    } 
});

2. 用Promise+async await封装异步操作

如果项目环境支持ES6+语法,可以把request封装为Promise,用await等待请求完成后再执行后续逻辑,代码可读性更高:

// 封装request为Promise
function requestPromise(url) {
    return new Promise((resolve, reject) => {
        request(url, (error, response, html) => {
            if(error) return reject(error);
            if(response.statusCode !== 200) return reject(new Error(`请求失败,状态码:${response.statusCode}`));
            resolve(html);
        })
    })
}

// 异步函数内执行逻辑
async function getLocationList() {
    const locationArray = [];
    try {
        const html = await requestPromise(process.env.RESOURCE_SHEET);
        const $ = cheerio.load(html);
        $("h3").each((i, lle) => {
            const location = $(lle).text();
            if(location.includes("Kansas")) return;
            const level = location.includes("In Stock") ? location + " ✅" : location + " ❌";
            locationArray.push(level);
        });
        locationArray.push("test");
        console.log(locationArray); // 可以拿到完整的数组内容
        return locationArray;
    } catch (err) {
        console.error('请求处理失败:', err);
    }
}

// 调用函数触发逻辑
getLocationList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:15:01