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

如何在axios外部返回变量?异步请求赋值后变量为空问题求助

解决Axios异步请求后返回空变量的问题

你遇到的这个问题本质是异步操作的执行顺序问题,axios的get请求是异步的——也就是说你写的.then()里的代码,要等网络请求完成后才会执行,但你的return userInfo是在请求还没结束的时候就跑了,这时候userInfo还是你一开始定义的空对象,自然拿不到数据。

给你两种常用的解决方法:

方法一:使用async/await(最直观)

把factoryBootup改成异步函数,用await等待axios请求完成,这样代码会按你预期的顺序执行:

async function factoryBootup() {
  var userInfo = { userName: "", prefixUrl: "" };
  let instance = axios.create({ timeout: requestTimeout });
  
  try {
    const response = await instance.get(bootUrl);
    // 这里不需要JSON.stringify再parse,response.data本身就是解析好的对象
    const a = response.data;
    userInfo.userName = a.userInfo.userId;
    userInfo.prefixUrl = a.userInfo.urlId;
  } catch (error) {
    console.log("Get error happens: " + error);
  }
  
  return userInfo;
}

// 调用的时候也要用await或者.then()
// 比如在另一个async函数里:
async function useUserInfo() {
  const info = await factoryBootup();
  console.log(info); // 这里就能拿到正确的数据了
}

注意:await只能在async函数里使用,所以调用这个函数的地方也要配合异步语法。另外,你原来代码里的JSON.stringify再JSON.parse是多余的,axios已经自动把响应体解析成JSON对象了,直接用response.data就行。

方法二:让函数返回Promise

如果你不想用async/await,也可以让factoryBootup直接返回一个Promise,调用的时候通过.then()获取结果:

function factoryBootup() {
  let instance = axios.create({ timeout: requestTimeout });
  
  return instance.get(bootUrl)
    .then(function(response) {
      const a = response.data;
      return {
        userName: a.userInfo.userId,
        prefixUrl: a.userInfo.urlId
      };
    })
    .catch((error) => {
      console.log("Get error happens: " + error);
      // 出错时可以返回默认值或者reject
      return { userName: "", prefixUrl: "" };
    });
}

// 调用方式:
factoryBootup().then(userInfo => {
  console.log(userInfo); // 这里拿到正确的数据
});

这种方式是利用Promise的链式调用,把最终的userInfo作为Promise的结果返回,外部通过.then()来接收异步完成后的数据。

总结一下:异步操作不能像同步代码那样直接return结果,必须等待异步操作完成后再返回,用async/await或者Promise链式调用都是解决这类问题的标准做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:01