国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

深入理解JavaScript的async/await

2024-05-06 15:32:08
字體:
來源:轉載
供稿:網友

async 和 await 在干什么

任意一個名稱都是有意義的,先從字面意思來理解。async 是“異步”的簡寫,而 await 的意思是等待。所以應該很好理解 async 用于申明一個 function 是異步的,而 await 等待某個操作完成。

那么async/await到底是干嘛的呢?我們先來簡單介紹一下。

async/await 是一種編寫異步代碼的新方法。之前異步代碼的方案是回調和 promise。 async/await 是建立在 promise 的基礎上。(對promise不熟悉的同學可以看一下這篇文章入門Promise的正確姿勢) async/await 像 promise 一樣,也是非阻塞的。 async/await 讓異步代碼看起來、表現起來更像同步代碼。這正是其威力所在。

async 起什么作用

這個問題的關鍵在于,async 函數是怎么處理它的返回值的!

我們當然希望它能直接通過 return 語句返回我們想要的值,但是如果真是這樣,似乎就沒 await 什么事了。所以,寫段代碼來試試,看它到底會返回什么:

 

<script>    async function test(){    return 'hello async';  }  let result = test();  console.log(result);</script>

看到輸出就恍然大悟了——輸出的是一個 Promise 對象。

Promise {<resolved>: "hello async"}

所以,async 函數返回的是一個 Promise 對象。async 函數(包含函數語句、函數表達式、Lambda表達式)會返回一個 Promise 對象,如果在函數中 return 一個直接量,async 會把這個直接量通過 Promise.resolve() 封裝成 Promise 對象。

async 函數返回的是一個 Promise 對象,所以在最外層不能用 await 獲取其返回值的情況下,我們當然應該用原來的方式:then() 鏈來處理這個 Promise 對象,就像這樣

async function test(){   return 'hello async'; } test().then((val) => {   console.log(val);  //hello async  })

現在回過頭來想下,如果 async 函數沒有返回值,又該如何?很容易想到,它會返回 Promise.resolve(undefined)。

聯想一下 Promise 的特點——無等待,所以在沒有 await 的情況下執行 async 函數,它會立即執行,返回一個 Promise 對象,并且,絕不會阻塞后面的語句。這和普通返回 Promise 對象的函數并無二致。

那么下一個關鍵點就在于 await 關鍵字了。

await 到底在等啥

一般來說,都認為 await 是在等待一個 async 函數完成。不過按語法說明,await 等待的是一個表達式,這個表達式的計算結果是 Promise 對象或者其它值(換句話說,就是沒有特殊限定)。

因為 async 函數返回一個 Promise 對象,所以 await 可以用于等待一個 async 函數的返回值——這也可以說是 await 在等 async 函數,但要清楚,它等的實際是一個返回值。注意到 await 不僅僅用于等 Promise 對象,它可以等任意表達式的結果,所以,await 后面實際是可以接普通函數調用或者直接量的。所以下面這個示例完全可以正確運行。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 高安市| 思茅市| 灵石县| 常州市| 安仁县| 特克斯县| 东丽区| 莎车县| 沛县| 牡丹江市| 永济市| 都匀市| 灌南县| 芒康县| 大悟县| 抚顺县| 密云县| 南雄市| 敦化市| 景洪市| 永清县| 枣阳市| 宜宾县| 慈溪市| 汨罗市| 普格县| 乐业县| 平罗县| 东乡县| 长海县| 吴堡县| 石屏县| 米林县| 潢川县| 崇明县| 城固县| 桐乡市| 嘉鱼县| 兰坪| 门源| 新和县|