SOURCE

//一旦Generator执行过程中抛出错误,且没有被内部捕获,就不会再执行下去了
//如果此后再调用next方法,将返回一个value属性等于undefined/ done属性等于true的对象.
//即JavaScript引擎认为Generator已经运行结束了.
function* g() {
  yield 1;
  console.log('throwing an exception');
  throw new Error('generator broke!');
  yield 2;
  yield 3;
}


function log(generator) {
  var v;
  console.log('starting generator');
  try {
    v = generator.next();
    console.log('第一次运行next方法', v);
  } catch (err) {
    console.log('捕捉错误', v);
  }
  try {
    v = generator.next();
    console.log('第二次运行next方法', v);
  } catch (err) {
    console.log('捕捉错误', v);
  }
  try {
    v = generator.next();
    console.log('第三次运行next方法', v);
  } catch (err) {
    console.log('捕捉错误', v);
  }
  console.log('caller done');
}

//log(g());
//-------------return函数------------------//
function* gen(){
    yield 1;
    yield 2;
    yield 3;
}

var g=gen();
console.log(g.next());
console.log(g.return('foo'));
console.log(g.next());
//调用return方法后,返回值的value属性就是return()方法的参数foo.
//并且Generator的遍历就终止了,返回值done属性为true

//-------------------//
const g1 = function* (x, y) {
  let result = yield x + y;
  return result;
};

const gen1 = g1(1, 2);
console.log(gen1.next()); // Object {value: 3, done: false}
//第二个next(1)方法就相当于把yield表达式 替换成一个值1. 如果next方法没有参数,相当于替换成undefined
console.log(gen1.next(1)); 
//throw()是将yield表达式替换成一个throw语句
//return()是将yield表达式替换成一个return语句
console 命令行工具 X clear

                    
>
console