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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:36:01