Generator函數與async函數對比

Generator函數與async函數對比

Generator函數:

Generator函數是ES2015提供的異步解決方案,與普通函數有很大的不一樣;es6

  • 特徵:
  1. 在function關鍵字後面跟一個(*)號;
  2. 在函數體內部使用yield表達式做爲一個狀態;

Generator函數返回一個遍歷器,可經過for……of方法遍歷每一個狀態;promise

  • 用法:

執行Generator並不馬上執行,返回一個遍歷器,遍歷器經過調用next()、throw()或者return()執行下一個狀態、捕獲錯誤或者結束遍歷器;異步

async函數:

async函數是ES2017提供的異步函數語法,是generator的語法糖,可是用法上與Generator函數仍是有很大不一樣;async

  • 特徵:
  1. 在function關鍵字前面跟一個async關鍵字;
  2. 在函數體內部使用await表達式;

async函數返回一個promise對象;函數

  • 用法:

執行async函數會馬上執行,和普通函數同樣,可是返回一個promise對象;對象

二者對比:

  1. Generator 出如今ES2015中,async 出如今ES2017中,async 是 Generator 的語法糖;
  2. 執行方式不一樣,Generator 執行須要使用執行器(next()等方法);async 函數自帶執行器,與普通函數的執行同樣;
  3. async 的語法語義更加清楚,async 表示異步,await 表示等待;而 Generator 函數的(*)號和 yield 的語義就沒那麼直接了;
  4. Generator 中 yield 後面只能跟 Thunk 函數或 Promise 對象;而 async 函數中 await 後面能夠是 promise 對象或者原始類型的值(會自動轉爲當即resovle的promise對象);
  5. 返回值不一樣,Generator 返回遍歷器,相比於 async 返回 promise 對象操做更加麻煩。

參考:ip

ECMAScript 6入門get

相關文章
相關標籤/搜索