Generator的throw方法,try-catch错误后继续执行yield语句
http://es6.ruanyifeng.com/#docs/generator 学习Generator的throw方法遇到个问题。
var gen = function* gen() {
try {
yield console.log('hello');
yield console.log('world');
}
catch (e) {
console.log(e);
}
yield console.log('test');
yield console.log('end');
}
var g = gen();
g.next();
g.throw('a');
g.next();
// hello
// a
// test
// end
执行g.throw(‘a’),catch到错误之后,为什么会执行一个yield语句?输出了test。
重新说明下: g.throw(‘a’)执行后, 输出了两个,一个是a,一个是test。 之后的g.next(),输出了end。
这里的问题是, yield console.log(‘test’),这条语句为什么会被g.throw(‘a’)执行,不应该是下一条的语句g.next()执行吗?
6 回复
??没看懂问题。不仅输出了 test,还输出了 end 啊
@alsotang 重新编辑了。能看下是什么原因吗?
呃。。.throw
的行为就长这样,我另外找了一个例子,不知可不可以帮助理解这个地方。
function* boring() {
try {
yield 'one';
} catch (ex) {
console.log('exception caught inside:', ex);
}
yield 'two';
}
var gen = boring();
var iter = gen.next();
while (!iter.done) {
console.log(iter.value, iter.done);
if (iter.value === 'one') {
iter = gen.throw('shut up'); // 强行异常,无情无义无理取闹
} else {
iter = gen.next();
}
}
@alsotang thx,throw这么搞不科学- -
问题在哪里?你不是catch了吗?往下执行有什么,问题?
@iamcc 没问题,只是觉得throw-catch之后的yield语句,应该我自己调用next去执行,而不是它自己去执行了。