ES6中async函數(shù)(一) 關(guān)于await

后端框架koa2中采用了async函數(shù)取代了前一代中的Generator函數(shù),所以有必要對async函數(shù)進(jìn)行進(jìn)一步的理解。


首先應(yīng)該明白async函數(shù)其實(shí)只是Generator函數(shù)的一個(gè)語法糖而已,對于Generator函數(shù)而言,他無法自執(zhí)行,而需要自己來書寫或?qū)雸?zhí)行器來幫助執(zhí)行,而對于async函數(shù)來說,只需要想普通的同步函數(shù)一樣調(diào)用即可,只是在書寫函數(shù)時(shí)需要在開頭加入async,而在內(nèi)部需要進(jìn)行異步操作的地方加上await。


注意:await后面要等待的是什么?
答:一個(gè)Promise對象
我們來看下面這個(gè)例子:

await后面不是Promise對象時(shí)
執(zhí)行結(jié)果如下所示:
我們可以很清楚的發(fā)現(xiàn),當(dāng)await后面不是一個(gè)Promise對象時(shí),那么他將不被await等待,若是一個(gè)異步操作,就會(huì)被加入異步隊(duì)列。
執(zhí)行結(jié)果
現(xiàn)在對代碼稍作修改,將await后面的代碼改成Promise對象的形式:
await后面是Promise對象時(shí)
執(zhí)行結(jié)果如下所示:
執(zhí)行結(jié)果
我們可以發(fā)現(xiàn)改成Promise對象后await就發(fā)揮作用了,這時(shí)async函數(shù)內(nèi)部會(huì)等到await后面的Promise對象的狀態(tài)變成resolved或是rejected時(shí)再進(jìn)行下一步的操作。注意:若Promise對象內(nèi)部操作結(jié)束后既沒有調(diào)用resolve也沒有調(diào)用reject函數(shù),那么將一直處于pending狀態(tài),那么async函數(shù)也就一直停滯在await處不再向下執(zhí)行,執(zhí)行結(jié)果也就如下圖所示了
Promise對象內(nèi)部狀態(tài)不發(fā)生改變時(shí)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容