? ? ? ?async 是“異步”的簡寫,比如Ajax中就有這個代表異步請求;而 await 可以認(rèn)為是 async wait 的簡寫,因為await只能出現(xiàn)在async函數(shù)中的語法規(guī)定。所以應(yīng)該很好理解 async 用于申明一個 function 是異步的,而 await 用于等待一個異步方法執(zhí)行完成。
一.async到底是個什么東西
? ??async 函數(shù)返回的是一個 Promise 對象。async 函數(shù)(包含函數(shù)語句、函數(shù)表達(dá)式、Lambda表達(dá)式)會返回一個 Promise 對象,如果在函數(shù)中 return 一個直接量,async 會把這個直接量通過 Promise.resolve() 封裝成 Promise 對象。如下圖所示:

很明顯async函數(shù)返回的就是promise對象。
那么在沒有await配合下,async返回promise對象,所以可以配合then處理如下圖:

二.那么await等到底等的什么:
await 是個運(yùn)算符,用于組成表達(dá)式,await 表達(dá)式的運(yùn)算結(jié)果取決于它等的東西。如果它等到的是一個 Promise 對象,等 Promise 對象 resolve,然后得到 resolve 的值,作為 await 表達(dá)式的運(yùn)算結(jié)果。sync 函數(shù)調(diào)用不會造成阻塞,它內(nèi)部所有的阻塞都被封裝在一個 Promise 對象中異步執(zhí)行。

如果改用 async/await 呢,會是這樣

這兩段代碼,兩種方式對異步調(diào)用的處理(實際就是對 Promise 對象的處理)差別并不明顯,甚至使用 async/await 還需要多寫一些代碼,那它的優(yōu)勢到底在哪?
三.async/await 的優(yōu)勢在于處理 then 鏈:
? ? ?單一的 Promise 鏈并不能發(fā)現(xiàn) async/await 的優(yōu)勢,但是,如果需要處理由多個 Promise 組成的 then 鏈的時候,優(yōu)勢就能體現(xiàn)出來了(很有意思,Promise 通過 then 鏈來解決多層回調(diào)的問題,現(xiàn)在又用 async/await 來進(jìn)一步優(yōu)化它)。
假設(shè)一個業(yè)務(wù),分多個步驟完成,每個步驟都是異步的,而且依賴于上一個步驟的結(jié)果。我們?nèi)匀挥?setTimeout 來模擬異步操作:

現(xiàn)在用 Promise 方式來實現(xiàn)這三個步驟的處理:

接下來用 async/await 來實現(xiàn):
