如何调用异步函数

chr*_*ris 10 javascript request node.js async-await

我希望控制台首先打印'1',但我不确定如何调用异步函数并等待其执行,然后再转到下一行代码.

const request = require('request');

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

}

getHtml();
console.log('2');
Run Code Online (Sandbox Code Playgroud)

当然,我得到的输出是

2
1
Run Code Online (Sandbox Code Playgroud)

Tak*_*aki 17

根据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')
})()
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


Wil*_*een 13

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

  1. 如果函数不返回 Promise,JS 引擎会将此值包装到已解析的 Promise 中。因此,该函数将始终返回一个承诺。
  2. await我们现在可以在这个函数中使用关键字。关键字await使得“等待”承诺得到解决成为可能。这让我们能够以同步方式编写异步代码。例如本教程

在您的示例中,console.log(2)始终会先完成,因为在 JS 应用程序中,同步代码始终会先于异步代码先完成。Promise 始终是异步的,因此async顾名思义,它们也是异步的。有关这方面的更多信息,请查看事件循环。


h1b*_*b9b 9

await如果想在继续或使用之前等待它解析,您应该使用异步函数.then()

await getHtml();
console.log('2');
Run Code Online (Sandbox Code Playgroud)

或者

getHtml()
 .then(() => {
    console.log('2');
 });
Run Code Online (Sandbox Code Playgroud)

  • 关于第一个建议:在主作用域/全局作用域中使用 `await` 是一个语法错误。 (5认同)