深入ES6生成器函数
如果你对ES6的生成器函数不是很熟,可以先阅读基础部分ES6生成器函数基础。弄懂了基础内容,接下来就可以进一步深入研究了。
错误处理
ES6生成器函数的一个强大特性是其内部的代码看起来是同步的,即便是外部的迭代控制部分是异步的。
在生成器函数内部我们可以使用非常熟悉的try..catch错误处理技术,例如:
function *foo() {
try {
var x = yield 3;
console.log('x: ' + x); // may never get here!
}
catch (err) {
console.log('Error: ' + err);
}
}
生成器函数可能会在yield 3表达式这里暂停任意长时间,如果一个错误被回传给生成器函数,则try..catch会catch住。但是具体怎么回传一个错误到生成器函数呢?
var it = foo();
var res = it.next(); // {value: 3, done: false}
// instand of resuming normally with another `next()` call,
// let's throw a wrench (an error) into the gears:
it.throw('Oops!'); // Error: Oops!
这里你可以看到我们调用了迭代器的另一个方法throw(),向生成器函数内部抛了一个错误,而此时在生成器函数内部就好像在yield表达式暂停的地方抛出了一个错误,因此try..catch会catch住这个错误。注意如果我们向生成器函数内throw()了一个错误,但是并没有在生成器函数内部catch住该错误,那么错误会再反弹出去:
function *foo() {}
var it = foo();
try {
it.throw('Oops!');
}
catch (err) {
console.error('Error: ' + err); // Error: Oops!
}