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

标签 javascript generator throw

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

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

但是,除了向生成器抛出异常之外,throw() 方法是否还会推进迭代器并返回下一个 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关键字并返回yield表达式的结果?

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

谢谢!!!

最佳答案

它确实从收到错误的 yield 中推进生成器。但是,由于 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());

关于Javascript 生成器 throw() 方法推进迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37674321/

相关文章:

javascript - 为深层嵌套对象构建 promise 链

javascript - 如何删除位于圆边界外的标记?

c# - 用于聚合惰性列表的设计模式

java - @TableGenerator 的初始值属性在 Hibernate 中显示问题,但在 JPA 中则不然

testing - NUnit 测试生成器

c# - 在 catchblock 中使用 "Throw"(别无其他!)

javascript - 如何刷新 qtip 标签以在悬停时显示特定按钮的新标签?

javascript - 使用内联 block 的并排div不起作用

c++ - 如何使模拟对象在 Google Mock 中引发异常?

c++ - 如何在 cppunit 中断言语句抛出 Excp1 或 Excp2 类型的异常?