如何在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
相关产品推荐
相关产品推荐

