Javascript 生成器 throw() 方法推进迭代器?
Javascript Generator throw() method advance the iterator?
我知道使用 next() 方法将迭代器推进到 yield 关键字的下一个位置和 return 包含 yield 表达式结果的对象,如下所示:
yield double(40); => call iterator.next() would return something like
{done:false, value:80}
但是我不太清楚 throw() 方法除了向生成器抛出异常外,是否还会推进迭代器和 return 下一个 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关键字和returnyield的结果表达式?
如果我需要包含代码片段来演示这一点,请告诉我,因为这是我在 Whosebug 上的第一个 post。
谢谢!!!
它确实从收到错误的收益中推进了生成器。但是,由于 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());
我知道使用 next() 方法将迭代器推进到 yield 关键字的下一个位置和 return 包含 yield 表达式结果的对象,如下所示:
yield double(40); => call iterator.next() would return something like {done:false, value:80}
但是我不太清楚 throw() 方法除了向生成器抛出异常外,是否还会推进迭代器和 return 下一个 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关键字和returnyield的结果表达式?
如果我需要包含代码片段来演示这一点,请告诉我,因为这是我在 Whosebug 上的第一个 post。
谢谢!!!
它确实从收到错误的收益中推进了生成器。但是,由于 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());