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 只有一根线程,如果没有异步编程,根本没法用,非卡死不可. 以前,异步编程 ...
随机推荐
- HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
j 今天下午一直报这个问题,google了半天没有找到答案.百度了下,说是 tomcat的 lib文件夹下缺少jstl1.2,因为项目里面用的也是 jstl1.2和 standard-1.1.2.ja ...
- Spring学习记录(十)---使用FactoryBean配置Bean
之前学了,配置bean可以用普通全类名配置.用工厂方法配置,FactoryBean又是什么呢 有时候配置bean要用到,IOC其他Bean,这时,用FactoryBean配置最合适. FactoryB ...
- SQL注入
@org.junit.Test public void testLogin() { CardDAO cd=new CardDAO(); if(cd.dengru("' or 1 = 1--& ...
- 字典 Key值转换为数组
public static string[] GetCategories() { Dictionary<string, int> itemMap = new Dictionary<s ...
- 记住密码超简单实现(C#)
实现效果如下 实现过程 [Serializable] class User { //记住密码 private string loginID; public string LoginID { get { ...
- datatable去重
两种方法1 数据库直接去除重复select distinct * from 表名去除了重复行distinct 2 对 DataTable直接进行操作DataTable dt=db.GetDt(&quo ...
- Vue 方法与事件处理器
按键修饰符 在监听键盘事件时,我们经常需要检测 keyCode.Vue.js 允许为 v-on 添加按键修饰符: <!-- 只有在 keyCode 是 时调用 vm.submit() --> ...
- MySql事务概述
事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一. 严格上来说,事务必须同时满足4个特性, ...
- 45 个非常有用的 Oracle 查询语句
这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快 ...
- ONE
我是漆黑夜空中 闪烁凄凄的一颗星 遥隔千里的双眸一遇 看到了,你那藏在泪光里的话 你一个人 把泪擦干 把话捏在手心 陪着我,承受着黑夜的孤独 说明:来自落网的一个期刊<ONE>. 听这个期 ...