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

时间: 2025-01-20 09:20:08

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

Es6系列之generator基础篇

Ecmascript 6简称es6,是javascript下一代标准,还处在开发阶段,估计2014年底发布,有关更多浏览器对es6的支持情况,点击这里 今天说说es6里新增的Generators. 下面是Generator系列的相关文章链接 Generator基础篇 深入Generator之异常处理与相互调用 深入Generator之异步方法处理 深入Generator之协程处理 Generator generator简单的说就是提供了一种控制函数内部执行状态的功能,以往的普通函数只要开始执行则

Es6系列之generator并发调用

今天来说说generator之间的并发调用,分析生成器之间相互协调处理的功能.类似于其实语言里的协程概念. 此篇文章参考老外的一篇文章: 传送门:) 下面是Generator系列的相关文章链接 Generator基础篇 深入Generator之异常处理与相互调用 深入Generator之异步方法处理 深入Generator之协程处理 CSP 这里先说下CSP(Communicating Sequential Processes),为什么说这个呢,因为它是协程的核心思想 CSP代表程序里的子程序之

Es6系列之深入generator2

在上一篇文章里深入的了解了generator的异常处理以及函数间的调用,这篇文章主要说说上一篇遗留的一些问题 异步方法的处理 此篇文章参考老外的一篇文章: 传送门:) 下面是Generator系列的相关文章链接 Generator基础篇 深入Generator之异常处理与相互调用 深入Generator之异步方法处理 深入Generator之协程处理 第一种方案 利用generator来调用异步主要是为了解决异常调用嵌套的问题,下面先模拟一个嵌套调用的异步过程. functin request(

.NET 并行(多核)编程系列之五 Task执行和异常处理

原文:.NET 并行(多核)编程系列之五 Task执行和异常处理 .NET 并行(多核)编程系列之五 Task执行和异常处理 前言:本篇主要讲述等待task执行完成. 本篇的议题如下: 1. 等待Task执行完成 2. Task中的异常处理   系列文章链接: .NET 4 并行(多核)编程系列之一入门介绍 .NET 4 并行(多核)编程系列之二 从Task开始  .NET 4 并行(多核)编程系列之三 从Task的取消  .NET 4 并行(多核)编程系列之四 Task的休眠  .NET 并行

.NET并行(多核)编程系列之五 Task执行和异常处理

前言:本篇主要讲述等待task执行完成. 本篇的议题如下: 1. 等待Task执行完成 2. Task中的异常处理 首先注意一点:这里提到的"等待"和之前文章提到的"休眠"意思是不一样的: 等待:在等待一个task的时候,这个task还是在运行之中的,"等待"相当于在监听运行的task的执行情况. 休眠:让tasku不运行. 在上篇文章中介绍了如果从Task中获取执行后的结果:在Task执行完成之后调用Task.Result获取.其实也可以用其他

Es6系列之module and class

Ecmascript 6简称es6,是javascript下一代标准,还处在开发阶段,估计2014年底发布,有关更多浏览器对es6的支持情况,点击这里 今天说说es6里新增的Module和Class. Class 关于class其实前端已有太多的模拟了,因为js本身的弱类型决定了只要你有想法什么编程模式都可以模拟出来,跟class相关的oop模式早已在后端领域扎根了,前端class概念大多是通过function函数来实现,现在我们来看看es6提供了什么语法?,我们先以下例子来说明,这样比较直观

Es6系列之destructuring assignments

Ecmascript 6简称es6,是javascript下一代标准,还处在开发阶段,估计2014年底发布,有关更多浏览器对es6的支持情况,点击这里 今天说说es6里对赋值语句的改进,简称解构赋值. 解构赋值 所谓解构赋值其实就是按照模式匹配进行批量赋值 下面的是以往的赋值语句 var a = 1; var b = 2; var c = 3; 以往的方式对于赋值多个变量的时候代码比较多而且不方便,那么es6里对它是怎么改进的呢? 通过以对象或者数组结构组装数据进行赋值,要保证赋值左右值类型相同

Enterprise Library Step By Step系列(十二)异常处理应用程序块

一.把异常信息Logging到数据库 在日志和监测应用程序块中,有朋友提意见说希望能够把异常信息Logging到数据库中,在这里介绍一下具体的实现方法. 1.创建相关的数据库环境: 我们可以用日志和监测应用程序块自带的SQL语句来创建相关的数据库环境: 创建数据库: CREATE DATABASE [Logging] ON (NAME = N'Logging', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\data\Loggi

保护模式汇编系列之二 - 中断和异常处理

如果你对中断是什么都不清楚的话,还是先Google一下中断的定义和基本概念吧,这里给出一个链接: http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7 好了,看完了这个链接,我想你已经大致明白了什么是中断,还有中断的作用了吧?我们再来总结下,其实简单说中断就是一种通知机制罢了.我们知道操作系统的一个核心任务就是和连接在主板上的所有的硬件设备进行通信,但是CPU和这些外设的速率根本就不在一个数量级上,倘若CPU向某一个设备发出一个请求并且一直等待反馈结果的话,