为何基于Promise的Axios请求返回Promise对象而非预期数据?
问题解决:async函数返回Promise而非预期数据的处理
核心原因
- async函数的本质:所有
async函数默认返回Promise对象,无论内部是否使用await。直接调用fetchApi()得到的是未完成状态的Promise,而非最终解析后的数据。 - 日志顺序问题:
console.log("returned response:", response)是同步代码,会在axios的异步HTTP请求完成前执行,因此先打印Promise { <pending> },待请求完成后才会执行.then里的日志。
修复方案
方案1:用async/await包裹调用(推荐)
将调用逻辑放在异步函数中,用await等待Promise解析:
const axios = require("axios"); async function fetchApi() { // 去掉冗余的.then,用await直接处理响应 const response = await axios.get("https://api.publicapis.org/entries"); console.log("logged response:", response.data.count); return response.data.count; }; // 立即执行异步函数处理调用 (async () => { const response = await fetchApi(); console.log("returned response:", response); })();
方案2:用.then处理Promise
通过Promise的.then方法获取解析后的数据:
const axios = require("axios"); async function fetchApi() { const response = await axios.get("https://api.publicapis.org/entries"); console.log("logged response:", response.data.count); return response.data.count; }; // 用.then接收异步结果 fetchApi().then(response => { console.log("returned response:", response); });
额外说明
- 原代码中同时使用
await和.then属于冗余写法,二选一即可,纯await写法更符合现代异步代码的可读性要求。 - HTTP请求本身是异步操作,无法通过同步函数直接返回结果,强行改为同步会阻塞Node.js事件循环,不推荐使用。
内容的提问来源于stack exchange,提问作者Miha Majcen
相关产品推荐
相关产品推荐

