ES6 Generator

ES6 Generator

function接上*即是

開啟REPL

function* Fruit() {
  yield 'apple';
  yield 'banana';
  return 'ending';
}

var a = Fruit();

執行

a.next()

另外試試

Fruit().next()

發現如直接對函式下next指令會無法往下遍歷

如沒加上yield

執行

發現函式一次執行完畢

yield不可放在沒有*的function中

執行會錯誤

generator函式執行時不會改變內部變數的值(yield應該放在每行的前面)

執行

發現到第二次z即不知道y的值

所以要改成

雖然要手動指定參數,但我們一般在函式內需要使用依賴變數不會用generator

如何讀取上次yield的變數?

發現順利計算

但y跟z變全域,因為yield後接var會出錯,而javascript預設也是在function執行完後釋放區域變數,所以本來的設定是yield後如果要變數保存,就必須設他為全域

使用for of

執行for of後發現chrome告知只有在strict才可執行

如何在chrome dev 加入strict mode?

所以我們改成

即可順利遍歷*foo()

yield*

在generator函式中插入另一個generator函式時 用到

印出x,y

印出x,a,b,y

yield*類似for of

處理callback

原本

使用generator

為任意對象加入Iterator後即可用next()

測試一個物件對象

接著輸入

發現物件對象無法用for of遍歷

於是我們再輸入,幫他加入iterator

這時輸入

以及

均可

但輸入next還是不行

所以我們生成一個b

之輸入b.next(),即可順利印出

但如果改成

之後輸入

發現第一個完後即無法在往下

查看一個數組有沒有iterator

有[Symbol.iterator]的方法都可用[...名字]去遍歷

只有object無法

yield 實用方法

在Promise中我們會在async function call的完成狀態(onSuccess)調用resolve(要傳下去的值),而在Generator中我們會調用g.next(要傳下去的值);其中next裡面放的是接下來要繼續處理的值

可參考http://programmermagazine.github.io/mag/pmag201505/focus3.html

Last updated

Was this helpful?