async/await其實(shí)是Generator 的語(yǔ)法糖,它能實(shí)現(xiàn)的效果都能用then鏈來(lái)實(shí)現(xiàn),它是為優(yōu)化then鏈而開(kāi)發(fā)出來(lái)的。從字面上來(lái)看,async是“異步”的簡(jiǎn)寫(xiě),await則為等待,所以很好理解async 用于申明一個(gè) function 是異步的,而 await 用于等待一個(gè)異步方法執(zhí)行完成。當(dāng)然語(yǔ)法上強(qiáng)制規(guī)定await只能出現(xiàn)在asnyc函數(shù)中,先來(lái)看看async函數(shù)返回了什么:
所以,async 函數(shù)返回的是一個(gè) Promise 對(duì)象。async 函數(shù)(包含函數(shù)語(yǔ)句、函數(shù)表達(dá)式、Lambda表達(dá)式)會(huì)返回一個(gè) Promise 對(duì)象,如果在函數(shù)中 return 一個(gè)直接量,async 會(huì)把這個(gè)直接量通過(guò) Promise.resolve() 封裝成 Promise 對(duì)象。
async 函數(shù)返回的是一個(gè) Promise 對(duì)象,所以在最外層不能用 await 獲取其返回值的情況下,當(dāng)然應(yīng)該用原來(lái)的方式:then() 鏈來(lái)處理這個(gè) Promise 對(duì)象,就像這樣:
那如果 async 函數(shù)沒(méi)有返回值,又該如何?很容易想到,它會(huì)返回 Promise.resolve(undefined)。
聯(lián)想一下 Promise 的特點(diǎn)——無(wú)等待,所以在沒(méi)有 await 的情況下執(zhí)行 async 函數(shù),它會(huì)立即執(zhí)行,返回一個(gè) Promise 對(duì)象,并且,絕不會(huì)阻塞后面的語(yǔ)句。這和普通返回 Promise 對(duì)象的函數(shù)并無(wú)二致。
注意:Promise.resolve(x) 可以看作是 new Promise(resolve => resolve(x)) 的簡(jiǎn)寫(xiě),可以用于快速封裝字面量對(duì)象或其他對(duì)象,將其封裝成 Promise 實(shí)例。