Generator.protype.sthrow()是如何工作的?是否包含隐式next()



我正在学习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();

在这种情况下,将在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()也被执行一样。

这是怎么发生的?

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

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

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

var value = yield i; -> throw()

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

最新更新