【问题标题】:Using axios with async and await将 axios 与 async 和 await 一起使用
【发布时间】:2018-09-03 13:43:00
【问题描述】:

我是 Async 和 await 生态系统的新手,但我知道它提供了一种同步方式的编码方式(尽管它在幕后是异步的,只是用代码编写的方式)。

这是我想要以异步方式执行的代码。

const axios = require("axios");
async function getJSONAsync(){
  // The await keyword saves us from having to write a .then() block.
  let json = await axios.get('https://tutorialzine.com/misc/files/example.json');
  console.log('after the call to service');
  // The result of the GET request is available in the json variable.
  // We return it just like in a regular synchronous function.
  return json;
}

let abc = getJSONAsync();
console.log('>>>>>>>>>>> abc', abc);

现在有一些我无法破解的查询,让我们先看看输出:

>>>>>>>>>>> abc Promise { <pending> }
after the call to service
  1. 该行是在调用服务之后在执行之后出现的。为什么?异步等待行为发生了什么?

请发表一些看法?

提前致谢,祝您编码愉快:)。

【问题讨论】:

    标签: node.js async-await axios


    【解决方案1】:

    您需要在另一个 async 函数中使用 await 调用 getJSONAsync

    async function main() {
        let abc = await getJSONAsync();
        console.log(abc);
        // ...
    }
    
     main();
    

    或调用它并等待返回的承诺解决(即使用Promise.prototype.then

    【讨论】:

    • 那我将如何调用主函数...与另一个异步等待?
    • 我想以同步的方式获取响应,比如 let a = getData(b);然后将其用于进一步使用?
    • 在发布的 sn-p 中,main 是一个异步函数。在 main 中,您可以使用 await 调用异步函数,其语法类似于调用同步函数。
    【解决方案2】:

    好的,在深入了解 async-await 魔法之后,我发现如果您只是尝试一些东西来检查,这样会更好:

    const axios = require("axios");
    async function getJSONAsync(){
      let json = await axios.get('https://tutorialzine.com/misc/files/example.json');
      console.log('after the call to service');
      return json;
    }
    
    (async()=>{
       let abc = await getJSONAsync();
       console.log('>>>>>>>>>>> abc', abc);
    })();
    

    在这里,我创建了一个异步匿名函数,该函数在创建后立即被调用。如果有人有任何疑问,请告诉我。

    仅供参考: 这在某种程度上是一个IIFE,立即调用函数表达式。

    【讨论】:

      【解决方案3】:

      当您遇到异步调用时,程序的控制权将返回给调用方法,直到异步调用完成。

      因此,在您的情况下,您调用异步方法,它发送异步请求以获取资源并返回到上一个(在调用堆栈上)方法。 在这种方法中,您然后尝试记录 abc,此时它仍在获取资源,因此您只需打印一个未决的承诺。 当异步调用最终完成时,控制权将交还给您的 getJSONAsync () 方法,并且那里的控制台日志会打印消息

      【讨论】:

        【解决方案4】:

        您将异步函数结果绑定到变量,然后记录该变量,这在当时是未解决的 Promise。当您收到请求的响应时,会出现第二个 console.log。

        为了回答您的问题,async/await 行为仅适用于 async 函数内部,而不适用于调用此函数等的其他代码部分。

        【讨论】:

          猜你喜欢
          • 2018-03-25
          • 1970-01-01
          • 1970-01-01
          • 2018-11-21
          • 2017-11-05
          • 2019-04-15
          • 2014-06-19
          • 2018-01-14
          • 2018-09-12
          相关资源
          最近更新 更多