Javascript 生成器 throw() 方法推进迭代器?

Javascript Generator throw() method advance the iterator?

我知道使用 next() 方法将迭代器推进到 yield 关键字的下一个位置和 return 包含 yield 表达式结果的对象,如下所示:

yield double(40); => call iterator.next() would return something like {done:false, value:80}

但是我不太清楚 throw() 方法除了向生成器抛出异常外,是否还会推进迭代器和 return 下一个 yield 的表达式。文档是这样说的:

The throw() method resumes the execution of a generator by throwing an error into it and returns an object with two properties done and value.

当我们调用iterator.throw()时,会不会把异常抛给生成器(异常被正确捕获),并前进到下一个yield关键字和returnyield的结果表达式?

如果我需要包含代码片段来演示这一点,请告诉我,因为这是我在 Whosebug 上的第一个 post。

谢谢!!!

它确实从收到错误的收益中推进了生成器。但是,由于 throw 在 yield 点引发了异常,除非生成器代码准备好捕获异常并吞下它,否则生成器将不会恢复并完成(done 设置为 true),冒泡将未捕获的异常上传到迭代器调用站点。

这是一个简单的演示,注意 genDrunk 呕吐 ;) -

function* genSober() {
  while(true) {
    try {
       yield 42;
    } catch(e) {
      console.log("I don't drink at work!");
    }
  }
}

var g = genSober();
console.log(g.next());
// { value: 42, done: false }
g.throw("Have some wine...");
console.log(g.next());

function* genDrunk() {
  while(true) {
    yield 42;
  }
}

g = genDrunk();
console.log(g.next());
try {
  g.throw("Have some wine...");
}
catch (e){
}
console.log(g.next());