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)更好的語義。語法
async
和await
,比起星號和yield
,語義更清楚了。async
表示函數裏有異步操做,await
表示緊跟在後面的表達式須要等待結果。
(3)更廣的適用性。
co
模塊約定,yield
命令後面只能是 Thunk 函數或 Promise 對象,而async
函數的await
命令後面,能夠是 Promise 對象和原始類型的值(數值、字符串和布爾值,但這時等同於同步操做)。
(4)返回值是 Promise。
async
函數的返回值是 Promise 對象,這比 Generator 函數的返回值是 Iterator 對象方便多了。你能夠用then
方法指定下一步的操做。
進一步說,async
函數徹底能夠看做多個異步操做,包裝成的一個 Promise 對象,而await
命令就是內部then
命令的語法糖。