为什么我的基于promise的请求在返回时返回promise对象和console.log中的预期数据



请检查下面的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);
}

您的fetchApiasync函数,这意味着它将返回一个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);

最新更新