为什么这个生成器会跳过 try 块之外的收益
Why does this generator skip a yield outside the try block?
Background
我正在试验Generator.prototype.throw()
的工作原理,并做了这个例子:
var myGen = function *() {
try{
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
catch(err) {
console.log(err);
}
yield 7;
yield 8;
yield 9;
}
var myIterator = myGen();
console.log(myIterator.next());
console.log(myIterator.next());
console.log(myIterator.next());
myIterator.throw(new Error('Bullocks!'));
console.log(myIterator.next());
console.log(myIterator.next());
console.log(myIterator.next());
在运行时会导致以下结果:
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
[Error: Bullocks!]
{ value: 8, done: false }
{ value: 9, done: false }
{ value: undefined, done: true }
问题
我可以理解yield 4
和try
块的剩余部分在抛出错误后被跳过。
但是为什么生成器会跳过yield 7
?
它不会跳过yield 7
. 调用 throw()
时,控制流进入catch
块,记录错误,然后继续执行,直到返回新的迭代器结果对象{ value: 7, done: false }
的下一个yield
。
只是在您的代码中,您不会console.log
这个特定的结果对象。 尝试:
console.log(myIterator.throw(new Error('Bullocks!')));
规范的步骤 11 和 13 对此进行了解释:
- 使用 abruptCompletion恢复 genContext 的暂停评估,这是暂停它的操作的结果。让结果是恢复的计算返回的完成记录。
- (...
- 返回完成(结果)。
相关文章:
- errors with Javascript try catch
- JSON.parse,已经在try/catch块中,仍然抛出语法错误
- 错误处理try&catch+回调
- 在try-catch块内的HTML文件中导入JavaScript文件
- 如果总是执行finally,为什么try会返回未更改的值
- 为什么这个生成器会跳过 try 块之外的收益
- 有没有一种方法可以将try-catch添加到Javascript中的每个函数中
- try声明变量的作用域
- Javascript Try Catch for DIV
- Oneliner:为什么这个收益未定义不是一个函数
- Safari 在尝试使用 Javascript try/catch 访问父窗口对象时未捕获异常
- 我如何等待收益
- 与在异步回调链中使用 try catch 块相比,返回异常有什么优势
- 在 Javascript 中,即使从未抛出异常,使用 try-catch 块是否昂贵
- JavaScript 中的 try-catch:如何获取原始错误的堆栈跟踪或行号
- 使用 try catch(e) 进行浏览器功能检测
- 了解 JavaScript 中的异常处理:当更改 try/catch 块的位置时,获得不同的输出
- 发电机,承诺和共同或然后收益
- 在 JavaScript 中用“try catch”包装每个方法的性能问题
- execScript try/catch in IE 8 中的怪异之处