Nodejs与ES6系列3:generator对象
3、generator对象
Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。Generator的中文翻译是生成器,它是ECMAScript6(代号harmory)中提供的新特性。在过去,封装一段运算逻辑的单元是函数。函数只存在“没有被调用”或者“被调用”的情况,不存在一个函数被执行之后还能暂停的情况,而Generator的出现让这种情况成为可能。
3.1、generator对象定义
Generator的定义十分简单,与普通的函数相比,它只多出一个*号。以下为简单例子:
function *dowork(a) {
var sum = yield a + 2;
sum = yield a + 4;
sum = yield a + 5;
}
var gen = dowork(10);
console.log(gen.next());
======
{ value: 12, done: false }
在dowork函数中通过yield关键字让程序暂停在当前位置,通过generator.next()单步执行,next返回一个对象包括value和done,value为当前程序的计算结果,而done则表示程序是否执行完成。
3.2、generator与异步操作
上一级讲了promise对象与异步操作,其实在ES6中也可以用generator来处理异步操作。
function *doWork() {
var url = 'http://www.163.com';
var url1 = 'http://www.sina.com';
var result = yield fetch(url);
var result1 = yield fetch(url1);
console.log(result1);
}
var generator = doWork();
var ret = generator.next();
ret.value.then(function (data) {
var ret1 = generator.next(data);
ret1.value.then(function (data) {
generator.next(data);
})
});
fetch函数是一个异步执行函数,返回promise对象,整个doWork函数由两个异步函数构成最后打印其中一个异步函数的结果,由于每个next返回的是promise对象因此需要在then中处理数据。
3.3、优化流程
generator实现异步可以让代码变得更线性,但是调用过程还是比较麻烦的,因此可以模仿tj大神的co框架(https://github.com/tj/co) 的原理开发一个简易控制流函数,暂且名字也取为co。
function co(generator) {
var gen = generator.next();
var next = function (gen) {
if (!gen.done) {
if (gen.value instanceof Promise) {
gen.value.then(function (data) {
next(generator.next(data));
})
}
else {
next(generator.next(data));
}
}
}
next(gen);
}
// 执行
co(doWork());
通过co包装的异步方法可以非常简单的执行,编程体验接近与java。
Nodejs与ES6系列3:generator对象的更多相关文章
- Nodejs与ES6系列2:Promise对象
2.promise对象 js单线程异步执行的特性,因此在代码中充斥着回调函数.随着回调函数的增加,代码的可读性会愈来愈差,因此引入promise对象是不错的一种选择,可以避免层层回调函数.在ECMA6 ...
- [ES6系列-07]Generator Function: 生成器函数
[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs Generator function 生成器函数是E ...
- Nodejs与ES6系列4:ES6中的类
ES6中的类 4.1.class基本语法 在之前的javascript语法中是不存在class这样的概念,如果要通过构造函数生成一个新对象代码 function Shape(width,height) ...
- ES6系列_9之对象
1.对象赋值 es5中的对象赋值方式如下: let name="小明"; let skill= 'es6开发'; var obj= {name:name,skill:skill}; ...
- Nodejs与ES6系列1:变量声明
1.声明变量 在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类,全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都 ...
- [js高手之路] es6系列教程 - 对象功能扩展详解
第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...
- 大白话,讲编程之《ES6系列连载》汇总
如果你经历过2,3年前的前端开发,你一定感受过兼容IE6,7的痛苦,一定用过网页三剑客的dreamweaver编写html,面试的时候面试官一定会问你:会用PS切图吗? 刚开始的时候你发现,web前端 ...
- ES6 系列之异步处理实战
前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我 ...
- 转: ES6异步编程:Generator 函数的含义与用法
转: ES6异步编程:Generator 函数的含义与用法 异步编程对 JavaScript 语言太重要.JavaScript 只有一根线程,如果没有异步编程,根本没法用,非卡死不可. 以前,异步编程 ...
随机推荐
- Atitit常见的标准化组织与规范数量jcp ecma iso
Atitit常见的标准化组织与规范数量jcp ecma iso 1. 常见的标准化组织1 1.1. 重要的基金会apache1 1.2. 美国国家标准学会(American NationalStand ...
- 基于JQuery的浮动DIV显示提示信息并自动隐藏
/** * 浮动DIV定时显示提示信息,如操作成功, 失败等 * @param string tips (提示的内容) * @param int height 显示的信息距离浏览器顶部的高度 * @p ...
- WindowsError的错误代码详解
0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存储空间不足,无法处理此命令. 9存储控制 ...
- .Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
在Andrioid开发中,常见的事件如下 单击事件 OnClickListener 长按事件 OnLongClickListener 滑动事件 OnTouchListenner 键盘事件 OnKeyL ...
- Android图片缓存之初识Glide
前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...
- IOS各种集合遍历效率对比
前言: 对于ios项目开发中总会遇见各种集合遍历,出于对各种遍历效率的好奇心,所以准备写个测试程序测试一下 首先:先声明一个NSMutableArray,测试数据量分别是1000条,10000条,10 ...
- EntityFramework之孩子删除(四)(你以为你真的懂了?)
前言 从表面去看待事物视线总有点被层层薄雾笼罩的感觉,当你静下心来思考并让指尖飞梭于键盘之上,终将会拨开浓雾见青天.这是我切身体验. 在EF关系配置中,我暂且将主体对象称作为父亲,而依赖对象称作为孩子 ...
- JS+CSS3实现带预览图幻灯片效果
这个案例学习起来还有点吃力,目前还没有独自自己写出来过,贴出来以免忘记. 慕课网该课程原地址:http://www.imooc.com/learn/412 源码: <!DOCTYPE html& ...
- iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案
今天在自己的项目中用CocoaPods引入第三方SDWebImage的时候,出现了问题.当更新完毕后,在终端没太注意这个问题的提示,就直接使用SDWebImage了,在使用的时候一些方法的提示和头文件 ...
- 基于表的数据字典构造MySQL建表语句
表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...