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
块然后在控制台上记录错误。
难以理解这段代码。
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
块然后在控制台上记录错误。