Generator函數與async函數對比
Generator函數:
Generator函數是ES2015提供的異步解決方案,與普通函數有很大的不一樣;es6
- 在function關鍵字後面跟一個(*)號;
- 在函數體內部使用yield表達式做爲一個狀態;
Generator函數返回一個遍歷器,可經過for……of方法遍歷每一個狀態;promise
執行Generator並不馬上執行,返回一個遍歷器,遍歷器經過調用next()、throw()或者return()執行下一個狀態、捕獲錯誤或者結束遍歷器;異步
async函數:
async函數是ES2017提供的異步函數語法,是generator的語法糖,可是用法上與Generator函數仍是有很大不一樣;async
- 在function關鍵字前面跟一個async關鍵字;
- 在函數體內部使用await表達式;
async函數返回一個promise對象;函數
執行async函數會馬上執行,和普通函數同樣,可是返回一個promise對象;對象
二者對比:
- Generator 出如今ES2015中,async 出如今ES2017中,async 是 Generator 的語法糖;
- 執行方式不一樣,Generator 執行須要使用執行器(next()等方法);async 函數自帶執行器,與普通函數的執行同樣;
- async 的語法語義更加清楚,async 表示異步,await 表示等待;而 Generator 函數的(*)號和 yield 的語義就沒那麼直接了;
- Generator 中 yield 後面只能跟 Thunk 函數或 Promise 對象;而 async 函數中 await 後面能夠是 promise 對象或者原始類型的值(會自動轉爲當即resovle的promise對象);
- 返回值不一樣,Generator 返回遍歷器,相比於 async 返回 promise 對象操做更加麻煩。
參考:ip
ECMAScript 6入門get