我正在学习Generator.prototype.throw()
,并测试了下面的代码。
var generator = function* () {
for(let i = 0; i < 10; i++) {
try {
var value = yield i;
console.log(i);
} catch(e) {
console.log("catch exception...");
}
}
};
var g = generator();
g.throw();
在这种情况下,chrome v49
下会抛出错误,提示“Uncaught undefined...”。
但是,如果我们首先调用 g.next()
,然后调用 g.throw()
,它就会起作用。
var generator = function* () {
for(let i = 0; i < 10; i++) {
try {
var value = yield i;
console.log(i);
} catch(e) {
console.log("catch exception...");
}
}
};
var g = generator();
g.next(); // Object {value: 0, done: false}
g.throw(); // catch exception...
g.next();
// 1
// Object {value: 2, done: false}
与此同时,i
值已被跳过,就像 g.next()
也被执行一样。
这是怎么发生的?
最佳答案
next()
和 throw()
都从离开的地方继续。在您的第一个示例中,这将位于第一行之前:
-> throw() for(let i = 0; i < 10; i++) {
因此错误未被捕获。在你的第二个例子中,这将在产量之后:
var value = yield i; -> throw()
由于错误被捕获,应用程序将继续到同一点。调用 next()
后,应用程序将从那里恢复。
关于javascript - Generator.prototype.throw() 是如何工作的?是否包含隐式的 next() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36446273/