我正在学习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();
在这种情况下,会抛出错误说&#34; Uncaught undefined ...&#34;在chrome v49
下。
但是,如果我们首先调用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()
也已执行一样。
这是怎么发生的?
答案 0 :(得分:3)
next()
和throw()
都会在您离开的地方继续。在你的第一个例子中,这将在你的第一行之前:
-> throw() for(let i = 0; i < 10; i++) {
因此错误未被捕获。在你的第二个例子中,这将是在收益率之后:
var value = yield i; -> throw()
由于错误被捕获,应用程序继续到同一点。调用next()
后,应用程序将从那里恢复。