Es6系列之深入generator之异常处理与相互调用

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里调用异步方法的情况.

点赞