目前在看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();
这时候会抛出"Uncaught undefined..."异常,我的测试环境是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()
也被执行了一次。Generator.prototype.throw()
到底做了什么工作?
第一个情况没有调
g.next()
直接调用g.throw()
,肯定是一个uncaught error。因为Generator函数是延迟的,不调用next是不会进入函数执行的。那么这里你直接g.throw(),抛出的异常没有在generator
的try-catch语句中,所以就直接抛到函数外了。第二种情况:
g.next()
:不解释g.throw()
:首先,这句话进入函数体去执行代码,相当于在var value = yield i;
后面抛了异常。所以跳过了console.log(i);
,执行了console.log("catch exception...");
。由于是在for
语句中,又还没有遇到yield
,所以进入了下一次循环(i = 1的循环)。直到遇到了yield i
,终止generator函数的执行,返回{value: 1, done: false}
。这里就是你说的“就好像g.next()也被执行了一次”g.next()
:不解释