ES6学习——生成器(Generators):yield*
2016-01-28 15:24
253 查看
yield*起到一个委派的作用,跟在它后面的表达式需要是个iterator,在规范的14.4.14中有详细的描述。下面我们看看怎么使用它:
由于生成器可以有返回值,那么可以利用yield*来递归调用另一个生成器:
在看看yield*对return和throw方法的处理,由于Chrome只实现了throw,下面就只看throw了:
*以上全部代码在Chrome 48下通过测试
function* foo() { yield* [1,2,3]; }
function* foo() { yield 1; yield 2; yield 3; } function* bar() { yield* foo();//生成器本身也是迭代器,所以可以用在yield*的后面 }
由于生成器可以有返回值,那么可以利用yield*来递归调用另一个生成器:
function* foo(x) { if (x < 3) { x = yield* foo( x + 1 ); } return x * 2; } var g = foo(1); console.log(g.next());//Object {value: 24, done: true}
在看看yield*对return和throw方法的处理,由于Chrome只实现了throw,下面就只看throw了:
function* callee() { try { yield 'b'; yield 'c'; } finally { console.log('finally callee'); } } function* caller() { try { yield 'a'; yield* callee(); yield 'd'; } catch (e) { console.log('[caller] ' + e); } } let genObj = caller(); console.log(genObj.next().value);//a console.log(genObj.next().value);//b genObj.throw(new Error('Problem!')) //finally callee //[caller] Error: Problem!上面的例子可以看出来,yield*有转发throw的作用,把callee中的throw调用,转发到了caller中。
*以上全部代码在Chrome 48下通过测试
相关文章推荐
- linux下mongodb安装和配置
- 数据结构基础(10) --单链表迭代器的设计与实现
- [s3c2416x移植u-boot-2015.10] 让u-boot-2015.10支持spl nand的启动
- 在存储过程中如何使用另一个存储过程返回的结果集
- Swift接口和扩展
- 【转】HTML5 jQuery图片上传前预览
- 查看PostgreSQL版本,编译器版本号
- scroll 区域滚动
- Clipboard 剪辑板
- jvm内存调优总结设置
- 《1》策略模式
- JAVA基础篇(一)------Iterator 迭代器
- AFNetworkReachabilityManager检查网络状态
- Android之网络编程(五)简易联接框架
- Django基础(一)
- Swift枚举和结构体
- 数据可视化入门:柱状图、雷达图等六种基本图表的特点和适用场合
- 区分window8中 ie10 window phone8
- void 0
- IOS仿今日头条滑动导航栏