使用具有异步的axios并等待

时间:2018-03-25 08:50:46

标签: node.js async-await axios

我是Async的新手,等待生态系统,但我知道它以同步的方式提供编码方式(虽然它在幕后是异步的,只是在代码中编写的方式)。

所以这是我想以异步方式做的代码。

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. 执行后,在调用服务之后行。为什么? async-await行为发生了什么变化?
  2. 请提出一些看法?

    提前感谢,并且编码很快:)。

4 个答案:

答案 0 :(得分:4)

您需要使用等待在另一个异步功能中调用getJSONAsync

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

 main();

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

答案 1 :(得分:3)

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

因此,在您的情况下,您调用异步方法,它发送和异步请求以获取资源并返回到先前(在callstack上)方法。 在那个方法中,你然后尝试记录abc,在那个时间点,它仍然在获取资源,所以你只需要打印一个待处理的promise。 当异步调用最终完成时,控制权将返回给您的getJSONAsync()方法,控制台日志会打印出消息

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

好吧,在深入研究 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);
})();

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