async/await+axios返回Pending Promise及.then返回undefined问题咨询
咱们一步步来解决你的两个问题哈:
第一个问题:为什么会返回Promise {<pending>}?怎么拿到响应数据?
你写的getCalcInfo是个async函数,所有async函数的返回值默认都是Promise对象——哪怕你内部写了return resultData,这个值也会被自动包装成一个resolved状态的Promise。所以你在main.js里直接赋值const calcInfo = calc.getCalcInfo();时,拿到的是还在等待请求完成的pending状态Promise,自然打不出数据。
解决办法有两种,选你习惯的就行:
方法1:用async/await(代码更清爽,推荐)
把main.js的逻辑放到一个async函数里,用await等待Promise完成:
// main.js const calc = require('./calc'); async function run() { const calcInfo = await calc.getCalcInfo(); console.log('calcInfo:', calcInfo); } run();
这样代码会等axios请求拿到响应后,再执行打印,就能看到你想要的数据了。
方法2:用Promise的.then()链式调用
如果不想用async/await,也可以用Promise的then方法处理结果:
// main.js const calc = require('./calc'); calc.getCalcInfo().then(calcInfo => { console.log('calcInfo:', calcInfo); });
当请求完成、Promise变成fulfilled状态时,then里的回调就会拿到响应数据。
第二个问题:修改后为什么返回undefined?
你修改后的getCalcInfo函数里,虽然调用了axios.post(),但你没把axios返回的Promise给return出去!axios.post本身是异步操作,会返回一个Promise,但你的函数内部只是执行了这个调用,却没有把这个Promise返回,所以函数默认返回undefined。
只需要加个return就行:
// calc.js const getCalcInfo = () => { // 把axios的调用结果return出去 return axios.post('/api/logis/getCalcInfo', {}) .then((result) => { return result; }); }
另外小补充:其实.then()里的return result可以省略,因为axios.post的then会自动把结果传递下去,直接写成return axios.post('/api/logis/getCalcInfo', {})就够了,效果完全一样。
现在你再调用getCalcInfo(),拿到的就是axios返回的Promise,之后用await或者.then()就能拿到响应数据啦。
内容的提问来源于stack exchange,提问作者rodpold

