async 函數

ES2017 標準引入了 async 函數,使得異步操做變得更加方便。異步

async 函數是什麼?一句話,它就是 Generator 函數的語法糖。async

前文有一個 Generator 函數,依次讀取兩個文件。函數

寫成async函數,就是下面這樣。code

一比較就會發現,async函數就是將 Generator 函數的星號(*)替換成async,將yield替換成await,僅此而已。對象

async函數對 Generator 函數的改進,體如今如下四點。字符串

(1)內置執行器。同步

Generator 函數的執行必須靠執行器,因此纔有了co模塊,而async函數自帶執行器。也就是說,async函數的執行,與普通函數如出一轍,只要一行。it

上面的代碼調用了asyncReadFile函數,而後它就會自動執行,輸出最後結果。這徹底不像 Generator 函數,須要調用next方法,或者用co模塊,才能真正執行,獲得最後結果。yield

(2)更好的語義。語法

asyncawait,比起星號和yield,語義更清楚了。async表示函數裏有異步操做,await表示緊跟在後面的表達式須要等待結果。

(3)更廣的適用性。

co模塊約定,yield命令後面只能是 Thunk 函數或 Promise 對象,而async函數的await命令後面,能夠是 Promise 對象和原始類型的值(數值、字符串和布爾值,但這時等同於同步操做)。

(4)返回值是 Promise。

async函數的返回值是 Promise 對象,這比 Generator 函數的返回值是 Iterator 對象方便多了。你能夠用then方法指定下一步的操做。

進一步說,async函數徹底能夠看做多個異步操做,包裝成的一個 Promise 對象,而await命令就是內部then命令的語法糖。

相關文章
相關標籤/搜索