? ? ?async函數(shù),類似generator函數(shù)都是為了方便于異步操作态鳖,而且表現(xiàn)形式也很類似只是將*變成 async篙议,yield變成了await。但是async函數(shù)執(zhí)行不像generator函數(shù)需要next诚啃、throw淮摔、return等手動(dòng)控制執(zhí)行,它是跟正常函數(shù)一樣的執(zhí)行始赎;async函數(shù)的表現(xiàn)比generator函數(shù)表現(xiàn)的更明確和橙,更方便于異步操作(async包含異步操作,await后的表達(dá)式需要等待結(jié)果)造垛;async函數(shù)中的適用性更廣泛魔招,await后面跟的表達(dá)式比yield更廣泛(雖然await之后的東西都會(huì)轉(zhuǎn)化為Promise對(duì)象);async函數(shù)返回的是一個(gè)Promise對(duì)象generator函數(shù)返回的是一個(gè)Iterator對(duì)象五辽。
? ? ? async函數(shù)返回的是一個(gè)Promise對(duì)象,所以一切ES6上的Promise的操作都可以適用于這個(gè)办斑,而且它的內(nèi)部機(jī)制是遇到await就先返回執(zhí)行,執(zhí)行結(jié)束后就接著執(zhí)行函數(shù)體內(nèi)后面的函數(shù)杆逗,類似jquery中ajax的async=false俄周,具體可以寫下代碼理解下,async函數(shù)內(nèi)部拋出錯(cuò)誤會(huì)直接將Promise的狀態(tài)變成rejected髓迎,拋出的錯(cuò)誤會(huì)被catch捕捉到回調(diào)函數(shù)中峦朗。async函數(shù)除了return或者throw之外只有所有await函數(shù)執(zhí)行完,狀態(tài)才會(huì)發(fā)生改變排龄,才會(huì)去執(zhí)行then方法波势,注意:只要await后面的Promise對(duì)象變成reject翎朱,整個(gè)async函數(shù)都會(huì)中止執(zhí)行除非將它放到try..catch中或者Promise自帶的catch;await只能存在在async函數(shù)中尺铣,否則會(huì)報(bào)錯(cuò)拴曲;async函數(shù)中兩個(gè)相互獨(dú)立的異步操作建議一次執(zhí)行。
? ? ? async函數(shù)的執(zhí)行原理:將Generator函數(shù)和自動(dòng)執(zhí)行器包裝成一個(gè)函數(shù)凛忿。異步遍歷器為異步操作提供原生的遍歷器接口澈灼,可以通過調(diào)用next方法返回一個(gè)Promise對(duì)象,resolve之后的參數(shù)具有value和done的屬性。for..of..遍歷同步遍歷器店溢,for ..await..of遍歷異步遍歷器叁熔。
? ? ? ?剩下的就是一些對(duì)異步遍歷器的表現(xiàn)形式,不想寫了床牧。