我正在学习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
下抛出一个错误,称为"未捕获未定义…"。
但是,如果我们先调用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()
之后,应用程序从那里恢复。