请检查下面的axios获取请求示例到随机公共api。
简介
我只想创建一个函数来执行get请求并返回数据,这样我就可以将返回的数据存储在一个变量中,并在我正在构建的UI中使用它。
目前,函数返回Promise对象,而不是预期的数据。
我还注意到,返回的promise对象是在记录的数据响应之前打印的。这让我认为,出于某种原因,返回命令没有等待承诺的解决。
我也可以使用除axios之外的任何其他库,但尝试了fetch,这给了我相同的结果。
此外,我尝试从其他关于这个主题的stackoverflow答案中执行正确的代码,但它给了我相同的结果。这让我觉得我的问题与我的环境有关。
我已经试过了
- 我查看了查询"的所有答案;axios请求返回未定义的";以及类似
- 我查看了关于";从axios请求"获取数据";以及类似
- 尝试使用react从浏览器执行代码
- 将函数更改为synchronous,而不是Promise对象返回
undefined
我的环境:
- 系统版本:macOS蒙特利12.4(21F79(
- 内核版本:Darwin 21.5.0
- Node@v18.7.0
- axios@0.21.4
- iterm@2
示例
该示例可以通过运行node script.js
来执行
// filename: script.js
const axios = require("axios");
async function fetchApi() {
const getRequest = await axios.get("https://api.publicapis.org/entries")
.then((response) => {
console.log("logged response:", response.data.count);
return response.data.count;
})
};
const response = fetchApi();
console.log("returned response:", response);
// execute@bash: node script.js
// returned response: Promise { <pending> }
// logged response: 1425
我的问题
我希望返回的结果和记录的结果是相同的。
请帮助我解决此问题。
由于数据还不存在,所以不可能返回数据。相反,你需要回报一个承诺。async
函数会自动返回promise,所以您已经完成了部分工作,但您目前没有从异步函数返回任何内容。我还建议您不要将async/await与.then
混合使用,因为这只会引起混乱:
async function fetchApi() {
const response = await axios.get("https://api.publicapis.org/entries")
return response.data.count;
};
要访问promise的最终值,您需要将代码放入异步函数中,然后等待promise:
async function someFunction() {
const count = await fetchApi();
console.log(count);
}
您的fetchApi
是async
函数,这意味着它将返回一个Promise
。
在Promise解析后,您应该使用await
或.then()
语法来执行下一步操作。
唯一的问题是,您不能在当前实现中使用await
语法,因为您在脚本文件的顶级中使用结果,而不是在函数内部,Node在旧版本中不支持顶级等待。
因此,您应该使用.then()
语法,如下所示:
fetchApi().then( response => {
console.log("returned response:", response)
};
或者,如果您想使用await
语法,请将代码封装在函数中:
async function main() {
const response = await fetchApi();
console.log("returned response:", response);
}
main();
如果您使用的是Node v14.8+,您可以在模块中使用await
:
const response = await fetchApi();
console.log("returned response:", response);