如何调用异步函数

Posted

技术标签:

【中文标题】如何调用异步函数【英文标题】:How to call an async function 【发布时间】:2018-10-03 13:21:44 【问题描述】:

我希望控制台首先打印“1”,但我不确定并等待其执行,然后再转到下一行代码。

const request = require('request');

async function gethtml() 

    await request('https://google.com/', function (error, response, body) 
    console.log('1');
  );



getHtml();
console.log('2');

当然,我得到的输出是

2
1

【问题讨论】:

***.com/questions/63482972/… 【参考方案1】:

你应该await async 函数,如果想等待它解决后再继续或使用.then()

await getHtml();
console.log('2');

getHtml()
 .then(() => 
    console.log('2');
 );

【讨论】:

关于第一个建议:在主作用域/全局作用域使用await是语法错误。 为了规避这个问题,您可以通过将您的 Js 文件 ext 更改为 .jsm 并在您的 html 脚本标签中键入 ='module' 来使用***等待【参考方案2】:

根据async_function MDN

返回值

将使用异步函数返回的值解析的 Promise,或因异步函数内抛出未捕获的异常而被拒绝。

async 函数将始终返回一个 promise,您必须使用 .then()await 来访问它的值

async function getHtml() 
  const request = await $.get('https://jsonplaceholder.typicode.com/posts/1')  
  return request


getHtml()
  .then((data) =>  console.log('1'))
  .then(() =>  console.log('2'));
  
// OR 

(async() => 
  console.log('1')
  await getHtml()  
  console.log('2')
)()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

【参考方案3】:

async 关键字放在函数之前使其成为异步函数。这基本上对函数做了两件事:

    如果一个函数没有返回一个promise,JS引擎会将这个值包装到一个resolved的promise中。因此,该函数将始终返回一个承诺。 我们现在可以在这个函数中使用await 关键字。 await 关键字使“等待”承诺得到解决成为可能。这让我们能够以同步的方式编写异步代码。例如this tutorial。

在您的示例中,console.log(2) 将始终首先完成,因为在 JS 应用程序中,同步代码总是先于异步代码完成。 Promise 始终是异步的,因此是 async 函数,顾名思义也是异步的。有关此检查的更多信息the event loop.

【讨论】:

以上是关于如何调用异步函数的主要内容,如果未能解决你的问题,请参考以下文章

循环内的异步函数完成后如何调用函数?

如何从同步代码 Python 中调用异步函数

如何调用异步函数

如何在异步函数中调用 redux 调度作为函数体?

如何在收到异步函数的回调之前使线程休眠?

如何在 React 的 UseEffect() 中调用异步函数?