首页 > 解决方案 > generator.next 如何在此代码中导致异常

问题描述

难以理解此代码。

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;)如何影响代码,我的意思是生成器只返回 yeilded 值?

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

标签: javascriptgenerator

解决方案


以下声明

generator.next()

将产生以下对象:

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

此时,生成器函数在当前产量处暂停,即

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

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

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

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

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

{
  value: undefined,
  done: true
}

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

有关更多详细信息,请参阅:MDN - Generator.prototype.throw()

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

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


推荐阅读