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?