一:Generator編程
Generator 函數是一個普通函數,可是有兩個特徵。一是,function
關鍵字與函數名之間有一個星號;二是,函數體內部使用yield
表達式,輸出不一樣的內部狀態。異步
執行 Generator 函數會返回一個遍歷器對象,能夠依次遍歷 Generator 函數內部的每個狀態。async
Generator 函數的調用方法與普通函數同樣,也是在函數名後面加上一對圓括號。不一樣的是,調用 Generator 函數後,該函數並不執行,返回的也不是函數運行結果,而是一個指向內部狀態的指針對象。而後,必須調用遍歷器對象的next
方法,使得指針移向下一個狀態。也就是說,每次調用next
方法,內部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個yield
表達式(或return
語句)爲止。換言之,Generator 函數是分段執行的,yield
表達式是暫停執行的標記,而next
方法能夠恢復執行。異步編程
二:生成器與迭代函數
Generator 函數就是遍歷器生成函數,所以能夠把 Generator 賦值給對象的Symbol.iterator
屬性,從而使得該對象具備 Iterator 接口。而 Generator中使用yield語句輸出被迭代的內容便可。spa
三:next方法可傳參指針
經過next
方法的參數,就有辦法在 Generator 函數開始運行以後,繼續向函數體內部注入值。也就是說,能夠在 Generator 函數運行的不一樣階段,從外部向內部注入不一樣的值,從而調整函數行爲。code
四:生成器的異步應用協程
ES6 之前,異步編程的方法,大概有下面四種。對象
Generator能夠經過yield分段執行,其實就是讓出cpu使用權,這種特性十分適合用來實現協程。
整個 Generator 函數就是一個封裝的異步任務的容器。異步操做須要暫停的地方,都用yield
語句讓出使用權。
next
方法的做用是分階段執行Generator
函數,繼續執行異步任務。
五:async 函數
async 函數是 Generator 函數的語法糖,進行了更友好的包裝。
async
函數就是將 Generator 函數的星號(*
)替換成async
,將yield
替換成await
,僅此而已。
var asyncTask = async function () { do... await(異步操做); do... await(異步操做); ...... };
async
函數對 Generator 函數做出改進:
(1)內置執行器。
Generator 函數的執行必須靠執行器,而async
函數自帶執行器,該函數一旦被調用就自動執行。
(2)返回值是 Promise。
async
函數的返回值是 Promise 對象,你能夠用then
方法指定下一步的操做。
進一步說,async
函數徹底能夠看做多個異步操做,包裝成的一個 Promise 對象,而await
命令就是內部then
命令的語法糖。
應用例子:
async function getStockPriceByName(name) { var symbol = await getStockSymbol(name); var stockPrice = await getStockPrice(symbol); return stockPrice; } getStockPriceByName('goog').then(function (result) { console.log(result); });