如何在request请求函数外部访问、处理并传递返回的响应数据
可行实现方案
方案1:Promise 封装
将请求逻辑封装为Promise,在外部通过then方法获取处理完成的数组:
// 封装请求逻辑为Promise function getLocationArray() { return new Promise((resolve, reject) => { request(process.env.RESOURCE_SHEET, (error, response, html) => { if (error || response.statusCode !== 200) { return reject(error || new Error('请求响应异常')) } const locationArray = [] 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) }) resolve(locationArray) }) }) } // 外部调用获取结果 getLocationArray().then(locationArray => { console.log(locationArray) // 可拿到正确的数组内容 // 所有依赖locationArray的后续逻辑都写在此处 }).catch(err => { console.error('数据获取失败:', err) })
方案2:回调函数传递
通过传入回调函数的方式,把处理好的数组传递到外部使用:
function fetchLocationArray(callback) { request(process.env.RESOURCE_SHEET, (error, response, html) => { if (error || response.statusCode !== 200) { return callback(error || new Error('请求响应异常')) } const locationArray = [] 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) }) callback(null, locationArray) }) } // 外部调用 fetchLocationArray((err, locationArray) => { if (err) { console.error('数据获取失败:', err) return } console.log(locationArray) // 可拿到正确的数组内容 // 所有依赖locationArray的后续逻辑都写在此处 })
方案3:async/await 同步写法
搭配Promise封装使用async/await语法糖,写法更接近同步代码逻辑:
// 复用方案1中封装好的getLocationArray Promise函数 async function mainLogic() { try { const locationArray = await getLocationArray() console.log(locationArray) // 可直接拿到正确的数组内容 // 所有依赖locationArray的后续逻辑都写在此处 } catch (err) { console.error('数据获取失败:', err) } } // 执行入口 mainLogic()
注意:所有依赖
locationArray的业务逻辑必须放在异步回调、then回调或者await语句之后执行,不能在全局作用域下同步读取,这是JS事件循环的执行规则决定的。
内容的提问来源于stack exchange,提问作者ConnorJ
相关产品推荐
相关产品推荐

