天天看点

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

异常处理

generator之间的调用

下面是generator系列的相关文章链接

<a href="http://www.ifeenan.com/javascript/2014-07-27-es6%e7%b3%bb%e5%88%97%e4%b9%8bgenerator%e5%9f%ba%e7%a1%80%e7%af%87/" target="_blank">generator基础篇</a>

<a href="http://www.ifeenan.com/javascript/2014-07-28-es6%e7%b3%bb%e5%88%97%e4%b9%8b%e6%b7%b1%e5%85%a5generator%e4%b9%8b%e5%bc%82%e5%b8%b8%e5%a4%84%e7%90%86%e4%b8%8e%e7%9b%b8%e4%ba%92%e8%b0%83%e7%94%a8/" target="_blank">深入generator之异常处理与相互调用</a>

<a href="http://www.ifeenan.com/javascript/2014-08-04-es6%e7%b3%bb%e5%88%97%e4%b9%8b%e6%b7%b1%e5%85%a5generator2/" target="_blank">深入generator之异步方法处理</a>

<a href="http://www.ifeenan.com/javascript/2014-08-15-es6%e7%b3%bb%e5%88%97%e4%b9%8bgenerator%e5%b9%b6%e5%8f%91%e8%b0%83%e7%94%a8/" target="_blank">深入generator之协程处理</a>

下面先以一个简单的例子来说明怎么捕获<code>generator</code>里的异常.

上面的例子就是在<code>generator</code>里面增加<code>try...catch</code>语句来捕获函数内部的异常,然后<code>generator</code>本身也提供了一个方法用于向外抛出异常

throw 此方法可以向外抛出异常,由外部的<code>try...catch</code>来捕获

假如<code>generator</code>内部没有加上<code>try...catch</code>,然后内部有异常的话,则异常默认会向上抛出,像上面那样的话则可以捕获.

注意:上面<code>generator</code>里的异常捕获只支持同步方法调用

之前我们都是那一个<code>generator</code>来举例子,下面我们说说怎么在<code>generator</code>函数里调用别的,先上一个例子,然后我们说说它是怎么工作的吧

<code>generator</code>提供了<code>yield*</code>的语法来支持调用别的<code>generator</code>函数

yield* 后面跟上别的<code>generator</code>实例就可以遍历别的<code>generator</code>里的<code>yield</code>了

看到上面<code>child</code>里的<code>return</code>了没,这个跟普通调用<code>generator</code>不同的时,这个返回值默认会传递给<code>yield*</code>表达式,像上面那样然后给<code>c</code>本地变量赋值

普通<code>yield</code>表达式假如想有返回值的话,则只能依赖后续的<code>next</code>传递参数进来

上面的例子里只是写了一层调用,其实在<code>child</code>函数还可以调用别的<code>generator</code>函数,然后在里面产生的异常也会一层一层的传递到外面来的. 看下面的例子

上面主要说了下<code>generator</code>关于同步操作下的异常处理,以及<code>generator</code>互相调用的问题,下一篇文章主要讲讲<code>generator</code>里调用异步方法的情况.