//一旦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