【问题标题】:How to return values from async functions using async-await from function? [duplicate]如何使用函数中的 async-await 从异步函数返回值? [复制]
【发布时间】:2018-09-30 23:19:24
【问题描述】:

如何从异步函数返回值? 我试着喜欢这个

const axios = require('axios');
async function getData() {
    const data = await axios.get('https://jsonplaceholder.typicode.com/posts');
    return data;
}
console.log(getData());

它返回给我这个,

Promise { <pending> }

【问题讨论】:

  • console.log(await getData()); (如果这段代码是另一个函数,那么它也需要标记为异步)
  • 或将此视为承诺,并以“旧”方式进行:getData().then(x =&gt; { console.log(x); } )
  • @pac0:那不返回值,这就是问题所在。
  • 在开发者控制台中,async function getData() {return await fetch('https://jsonplaceholder.typicode.com/posts');} 后面跟着 await getData()

标签: javascript node.js asynchronous async-await axios


【解决方案1】:

您的函数 getData 将返回一个 Promise。

所以你可以:

  • await 函数也可以得到结果。但是,为了能够使用await,您需要在async 函数中,因此您需要“包装”这个:

    async function callAsync() {
       var x = await getData();
       console.log(x);
    }
    callAsync();
    

    (为了清楚起见,我命名了函数,但在这种情况下,人们宁愿使用匿名函数调用;请参阅 TheReason 的 answer。)

  • 将结果用作普通 Promise,这是异步函数返回的内容。
    您必须使用 then 和回调:

    getData().then(x => { 
        console.log(x); 
    });
    

【讨论】:

    【解决方案2】:

    你不能在awaitasync 范围之外的东西。要获得预期的结果,您应该将 console.log 包装到异步 IIFE 中,即

    async function getData() {
      return await axios.get('https://jsonplaceholder.typicode.com/posts');
    }
    
    (async () => {
      console.log(await getData())
    })()
    

    Working 示例。

    更多关于async/await的信息

    由于axios 返回一个promise,async/await 可以为getData 函数省略,如下所示:

    function getData() {
      return axios.get('https://jsonplaceholder.typicode.com/posts');
    }
    

    然后像以前一样做

    (async () => {
       console.log(await getData())
    })()
    

    【讨论】:

    • (async () => { console.log(await getData()) })() 这是怎么回事?
    • 您是否正在运行匿名异步函数。对吗?
    • 但如果需要,您可以使用另一个“命名”函数。
    【解决方案3】:

    其他答案已经涵盖了这个罚款;但我想插话说养成创建和调用main 函数的习惯,而不是在全局范围内运行。即

    async function main(){
      let result = await getData();
    }
    
    main().catch(console.log);
    

    任何阅读您的代码的人都非常清楚这是您的应用入口点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-20
      • 2019-03-01
      • 2021-08-06
      • 1970-01-01
      • 2017-06-13
      • 2016-01-14
      相关资源
      最近更新 更多