JS中request请求函数内赋值的变量外部无法访问如何解决
问题原因
request.post 是异步IO方法,传入的回调函数会等待网络请求响应后才会执行,而你写在请求后的console.log('test3 ' + accessToken)是同步代码,会在事件循环中优先执行,此时请求还未返回,accessToken还未被更新,就出现了你看到的打印顺序。
解决方案
方案1:回调函数实现
把需要使用accessToken的业务逻辑放到请求成功的回调中执行即可:
var accessToken = 'test1'; request.post(authOptions, function(error, response, body) { // 先判断请求是否成功,避免异常 if (!error && response.statusCode === 200) { accessToken = body.access_token; console.log('test2 ' + accessToken); // 在这里调用后续需要用到token的函数 retrieve(accessToken); } }); function retrieve(token) { // 你的业务逻辑直接使用入参token即可 console.log('retrieve函数拿到的token:', token); }
方案2:Promise + async/await 实现(更推荐)
将异步请求封装为Promise,配合async/await控制执行顺序,避免多层回调嵌套:
// 封装获取token的方法为Promise function getAccessToken() { return new Promise((resolve, reject) => { request.post(authOptions, function(error, response, body) { if (!error && response.statusCode === 200) { resolve(body.access_token); } else { reject(error || new Error('获取accessToken失败')); } }); }); } // 主逻辑用async函数包裹 async function main() { try { const accessToken = await getAccessToken(); console.log('test3 ' + accessToken); // 后续业务逻辑直接使用accessToken即可 retrieve(accessToken); } catch (err) { console.error('请求出错:', err); } } main();
额外提示:你当前使用的
request库已经停止官方维护,后续项目建议选用原生支持Promise的请求库比如axios、node-fetch,无需手动做异步封装。
内容的提问来源于stack exchange,提问作者butterflynebula
相关产品推荐
相关产品推荐

