generator.next 如何在此代码中导致异常

how generator.next is causing an exception in this code

难以理解这段代码。

function* gen() {
  try {
    let result = yield "2 + 2 = ?"; // (1)

    alert("The execution does not reach here, because the exception is thrown above");
  } catch(e) {
    alert(e); // shows the error
  }
}

let generator = gen();

let question = generator.next().value; 

generator.throw(new Error("The answer is not found in my database")); // (2)

这一行 (let question = generator.next().value;) 如何影响代码,我的意思是仅生成器 return 生成值?

作者第三行的(1)是什么意思

下面的语句

generator.next()

将产生以下对象:

{
   value: "2 + 2 = ?",
   done: false
}

此时,生成器函数暂停在当前收益率,即

let result = yield "2 + 2 = ?";

如果您调用 generator.next() 并将任何参数传递给 next() 方法,该参数将成为 yield 表达式的值并分配给 result变量。

但是您没有调用 next(),而是调用了 throw 方法,这就像在当前 yield 所在的位置注入 throw 语句,即在第 (1) 行).

调用 throw() 会在 try 块内引发异常,然后被 catch 块捕获。

throw 方法 returns 一个对象,在您的情况下是:

{
  value: undefined,
  done: true
}

value 未定义,因为您没有 return 或从 catch 块中产生任何值。

详情请见:MDN - Generator.prototype.throw()

what does the author mean by (1) on the third line

作者可能试图传达生成器函数将在 (1) 处暂停;之后调用 throw() 方法将在 try 块内抛出错误,就好像在 (1) 处有一个 throw 语句,然后被 catch 块捕获; catch 块然后在控制台上记录错误。