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')