ES6學習筆記七:生成器與異步操做

一: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 之前,異步編程的方法,大概有下面四種。對象

  • 回調函數
  • 事件監聽
  • 發佈/訂閱
  • Promise 對象

 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);
});
相關文章
相關標籤/搜索