Node.js请求回调函数中array.push()方法不生效问题求助
问题根因:异步请求执行顺序问题
request 属于异步IO操作,你传入的回调函数不会同步执行,而是会等网络请求完成后才会被调度执行。你当前代码的实际执行顺序为:
- 初始化
locationArray空数组 - 发起request网络请求,注册好回调函数后直接继续向下执行后续代码
- 执行
locationArray.push("test")写入测试内容 - 执行
console.log(locationArray),此时数组内只有刚写入的test值 - 等网络请求成功返回后,才会执行回调内的逻辑,往数组内写入爬取到的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
相关产品推荐
相关产品推荐

