Generator.prototype.throw()如何工作?是否隐含了next()?

时间:2016-04-06 09:01:30

标签: javascript ecmascript-6

我正在学习Generator.prototype.throw(),我测试下面的代码。

var generator = function* () {
  for(let i = 0; i < 10; i++) {
    try {
      var value = yield i;
      console.log(i);
    } catch(e) {
      console.log("catch exception...");
    }
  }
};

var g = generator();
g.throw();

在这种情况下,会抛出错误说&#34; Uncaught undefined ...&#34;在chrome v49下。

但是,如果我们首先调用g.next(),然后调用g.throw(),它就会起作用。

var generator = function* () {
  for(let i = 0; i < 10; i++) {
    try {
      var value = yield i;
      console.log(i);
    } catch(e) {
      console.log("catch exception...");
    }
  }
};

var g = generator();
g.next(); // Object {value: 0, done: false}
g.throw(); // catch exception...
g.next();
// 1
// Object {value: 2, done: false}

与此同时,已跳过i值,就好像g.next()也已执行一样。

这是怎么发生的?

1 个答案:

答案 0 :(得分:3)

next()throw()都会在您离开的地方继续。在你的第一个例子中,这将在你的第一行之前:

-> throw() for(let i = 0; i < 10; i++) {

因此错误未被捕获。在你的第二个例子中,这将是在收益率之后:

var value = yield i; -> throw()

由于错误被捕获,应用程序继续到同一点。调用next()后,应用程序将从那里恢复。