簡體   English   中英

如何調用異步函數?

[英]How to call an async function?

我希望控制台首先打印“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

根據async_function MDN

返回值

一個 Promise,它將使用 async 函數返回的值來解決,或者被從 async 函數中拋出的未捕獲的異常拒絕。

async 函數將始終返回一個承諾,您必須使用.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>

async關鍵字放在函數之前使其成為異步函數。 這基本上對函數做了兩件事:

  1. 如果一個函數沒有返回一個 Promise,JS 引擎會將這個值包裝到一個已解析的 Promise 中。 因此,該函數將始終返回一個承諾。
  2. 我們現在可以在這個函數中使用await關鍵字。 await關鍵字可以“等待”一個承諾被解決。 這讓我們能夠以同步的方式編寫異步代碼。 例如本教程

在您的示例中, console.log(2)將始終首先完成,因為在 JS 應用程序中,同步代碼始終會先於異步代碼完成。 Promise 始終是async的,因此顧名思義也是異步的。 有關這方面 的更多信息,請查看事件循環。

您應該await異步功能,如果想在繼續之前等待它解決或使用.then()

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

或者

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM