ES6 Generator Function - 2
Demo how to use yield in generator function. Also pass argument in next function of Iterator
by Po-Jung Chen
JavaScript
/**
* yield 本身沒有返回值,或者說總是返回 undefined
* 但我們可以透過代入 next('<value'>) 來給 yield 值
**/
function* f() {
for(var i = 0; true; i++) {
console.log('i-before reset', i)
let reset = yield i;
console.log('i-after reset', i)
console.log('reset ' + reset + ', i ' + i)
if(reset) { i = -1; }
}
}
var g = f();
console.groupCollapsed('first')
console.log(g.next()) // "i-before reset 0", Object {value: 0, done: false}
console.log(g.next()) // "i-after reset 0", "reset undefined", "i-before reset 1", i 0, Object {value: 1, done: false}
console.log(g.next()) // "i-after reset 1", "reset undefined, i 1", "i-before reset 2", Object {value: 2, done: false}
console.log(g.next(true)) // "i-after reset 2", "reset true, i 2", "i-before reset 0", Object {value: 0, done: false}
console.log(g.next()) // "i-after reset 0", "reset undefined, i 0", "i-before reset 1" Object {value: 1, done: false}
console.groupEnd('first')
/**
* V8 引擎直接忽略第一次使用 next 方法時的參數,
* 只有從第二次使用 next 方法開始,參數才是有效的。
* 從語義上講,第一個 next 方法用來啟動遍歷器對象,
* 所以不用帶有參數。
**/
function* f2() {
for(var i = 0; true; i++) {
let reset = yield i;
console.log('afterReset ' + reset + ', i ' + i)
if(reset) { i = -1; }
}
}
var g2 = f2();
console.groupCollapsed('second')
console.log(g2.next('a')) // Object {value: 0, done: false}
console.log(g2.next('b')) // "afterReset b, i 0", Object {value: 0, done: false}
console.log(g2.next('c')) // "afterReset c, i 0", Object {value: 0, done: false}
console.log(g2.next(true)) // "afterReset true, i 0", Object {value: 0, done: false}
console.log(g2.next('e')) // "afterReset e, i 0", Object {value: 0, done: false}
console.groupEnd('second')