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


目录
相关文章
|
26天前
|
JavaScript
js开发:请解释什么是ES6的Generator函数,以及它的用途。
ES6的Generator函数是暂停恢复的特殊函数,用yield返回多个值,适用于异步编程和流处理,解决了回调地狱问题。
16 6
|
1月前
|
JavaScript 前端开发
ES6之对象的简化
ES6(ECMAScript 2015)引入了一些新的语法特性,使得对象的定义和使用更加简洁和方便。以下是一些ES6中对象的简化写法:
|
1月前
|
JavaScript 前端开发 开发者
ABAP 740 中引入的 LET 表达式
ABAP 740 中引入的 LET 表达式
12 0
|
1月前
thinkphp5.1全局异常类封装
thinkphp5.1全局异常类封装
27 0
thinkphp5.1全局异常类封装
|
3月前
|
Python
Validator 类的设计和简单实现
Validator 类的设计和简单实现
31 0
|
3月前
|
JSON 前端开发 Java
SpringBoot - 统一格式封装及高阶全局异常处理
SpringBoot - 统一格式封装及高阶全局异常处理
47 0
|
4月前
|
前端开发
Nestjs(五)异常处理方式(异常过滤器)
Nestjs(五)异常处理方式(异常过滤器)
54 0
|
8月前
|
前端开发 新制造 UED
SpringBoot-23-全局异常机制+RESTful统一规范
SpringBoot-23-全局异常机制+RESTful统一规范
83 0
|
11月前
|
Java 编译器 程序员
try with resources简洁的异常捕获机制
try with resources简洁的异常捕获机制
71 0
Springboot 全局异常捕获以及统一接口返回结果
Springboot 全局异常捕获以及统一接口返回结果
256 0