Javascript Generator throw()方法可提高迭代器?

Pha*_*yen 3 javascript generator throw

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

产量增加一倍(40);=>调用iterator.next()将返回类似{done:false,value:80}的信息

但是,我不太清楚throw()方法是否还会将迭代器前进并返回下一个yield的表达式,除了将异常抛出到生成器中。文档说像这样:

throw()方法通过向生成器中抛出错误来恢复生成器的执行,并返回一个对象,该对象具有完成的两个属性和值。

当我们调用iterator.throw()时,是否会将异常抛出到生成器中(正确捕获了异常),并前进到下一个yield关键字并返回yield表达式的结果?

请让我知道是否需要包含代码片段来演示这一点,因为这是我在Stackoverflow上的第一篇文章。

谢谢!!!

haz*_*ous 5

它确实从收到错误的收益率提高了生成器。但是,由于在throwyield时引发了异常,除非生成器代码准备好捕获并吞下该异常,否则生成器将不会继续执行并完成(将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());
Run Code Online (Sandbox Code Playgroud)