ES6系列之深入Generator
在上一篇文章里简单的介绍了generator
的用法,这篇文章主要说说上一篇遗留的一些问题
- 异常处理
- generator之间的调用
此篇文章参考老外的一篇文章: 传送门:).
下面是Generator系列的相关文章链接
异常处理
下面先以一个简单的例子来说明怎么捕获generator
里的异常.
function * build(){
try{
throw new Error('from build!');
yield 'haha';
}catch(err){
console.log('inside error: ' + err);
}
}
var it = build();
it.next(); // => inside error: Error: from build!
上面的例子就是在generator
里面增加try...catch
语句来捕获函数内部的异常,然后generator
本身也提供了一个方法用于向外抛出异常
throw 此方法可以向外抛出异常,由外部的
try...catch
来捕获
function * build(){
try{
yield 'haha';
}catch(err){
console.log('inside error: ' + err);
}
}
var it = build();
try{
it.throw('from it'); // => out error from it
}catch(err){
console.log('out error: ' + err);
}
假如generator
内部没有加上try...catch
,然后内部有异常的话,则异常默认会向上抛出,像上面那样的话则可以捕获.
注意:上面generator
里的异常捕获只支持同步方法调用
generator 间调用
之前我们都是那一个generator
来举例子,下面我们说说怎么在generator
函数里调用别的,先上一个例子,然后我们说说它是怎么工作的吧
function* build(){
var a = yield 1;
var b = yield 2;
var c = yield* child();
console.log(a, b, c);
}
function* child(){
var x = yield 3;
var y = yield 4;
console.log(x, y);
return 'child';
}
var it = new build();
it.next();
it.next('a');
it.next('b');
it.next('c');
it.next('d');
// => c d
// => a b child
generator
提供了yield*
的语法来支持调用别的generator
函数
yield* 后面跟上别的
generator
实例就可以遍历别的generator
里的yield
了
看到上面child
里的return
了没,这个跟普通调用generator
不同的时,这个返回值默认会传递给yield*
表达式,像上面那样然后给c
本地变量赋值
普通yield
表达式假如想有返回值的话,则只能依赖后续的next
传递参数进来
上面的例子里只是写了一层调用,其实在child
函数还可以调用别的generator
函数,然后在里面产生的异常也会一层一层的传递到外面来的. 看下面的例子
function* build(){
var a = yield 1;
var b = yield 2;
try{
var c = yield* child();
}catch(err){
console.log('build error: ' + err);
}
console.log(a, b, c, d); // =>此处会向上抛异常 d未定义
}
function* child(){
var x = yield 3;
var y = yield 4;
console.log(x, y, c); // => 此处会向上抛异常 c未定义
return 'child';
}
var it = new build();
it.next();
it.next('a');
it.next('b');
it.next('c');
try{
it.next('d');
}catch(err){
console.log('out error: ' + err);
}
// => c d
// => a b child
总结
上面主要说了下generator
关于同步操作下的异常处理,以及generator
互相调用的问题,下一篇文章主要讲讲generator
里调用异步方法的情况.
时间: 2025-01-20 09:20:08