Generator的throw方法,try-catch错误后继续执行yield语句
发布于 10 年前 作者 steamwheedle 7098 次浏览 最后一次编辑是 8 年前 来自 问答

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去执行,而不是它自己去执行了。

回到顶部