javascript - 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)是什么意思
解决方案
以下声明
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
块捕获;catch
block 然后在控制台上记录错误。
推荐阅读
- listview - Android ListView 高度为 match_parent 减去固定高度
- google-apps-script - 为什么我在 Google 应用制作工具中调用这些脚本时会得到一个未定义的值?
- mysql - 检索由follows sql,mysql共享的其他用户帖子
- python - matplotlib 可重现图
- google-apps - 在开发者控制台中更新 android 内部测试应用
- xml - Odoo 11. 从 xml 导入
- python - pyspark - 如何删除所有重复的行(忽略某些列)而不留下任何重复的对?
- python - 如何在 python 中正确添加和递增整数字典值?
- powerbi - Power BI - 在另一条记录的时间范围内查找记录
- r - 从长到宽的数据重塑