Nodejs
在0.11.x后开始支持generator
,就是ES6
中会正式定稿的规范。而后就有了基于此特性的koa
框架,也就不少人所说的,以更优雅的方式进行流程控制。我的意见,若是没有过多的回调,没有大量的“恶魔金字塔”,仍是建议使用Express
框架,更易上手,中间件选择更多。接触koa
没几天,发现知识点略多略多,逐一击破。git
一样是0.11.x后开始原生支持的全局对象,规范与经常使用的Q
模块差别明显,但接口更简化,使用更方便。github
假设服务器端请求响应分为三步,加载模板---读取数据---渲染输出。
模板以下(article.jade):数据库
h3 | #{title} p | #{content}
数据以下(shuffle.json):express
{ "title": "love story", "content": "No matter what the world will be, never give up for entire life" }
业务代码以下:json
fs.readFile(path.join(__dirname, 'views/article.jade'), function(err, data) { if (err) throw err; var template = data.toString(); fs.readFile(path.join(__dirname, 'static/shuffle.json'), function(err, data) { if (err) throw err; var local = JSON.parse(data.toString()); console.log(jade.compile(template)(local)); }); });
经过两层回调函数来实现,加载JSON数据可使用require方式来实现,此处仅为说明状况,由于实际状况下,数据可能来自数据库调用,或者第三方API请求。数组
这种业务处理方式下,模板与数据存在相互依赖,但不是流程上的顺序并无严格要求,因此可以使用Promise,代码实现以下:服务器
var jadeTemplate = new Promise(function(resolve, reject) { fs.readFile(path.join(__dirname, 'views/article.jade'), function(err, data) { if (err) { reject(err.message); } else { resolve(data.toString()); } }); }); var localData = new Promise(function(resolve, reject) { fs.readFile(path.join(__dirname, 'static/shuffle.json'), function(err, data) { if (err) { reject(err.message); } else { resolve(JSON.parse(data.toString())); } }); }); Promise .all([jadeTemplate, localData]) .then(function(value) { console.log(jade.compile(value[0])(value[1])); });
代码量相对较多,可是效率更好,本机上测试,后者比前者快11ms,因此若有可能,采起后种。框架
关于generator,所谓的生成器,概念上感受比较绕口,因此请自行百度。功能上看,就是外部操做控制函数内部代码执行。举一个简单的例子以下:koa
// yield expression var story = function *() { yield 'first step'; console.log('first step'); yield 'second step'; console.log('second step'); }; var sequence = story(); sequence.next(); sequence.next(); sequence.next();
所谓外部操做控制内部代码执行,能够这么理解。代码从函数内部第‘0’行开始,外部的第一个next
方法,开始向下执行,到碰到yield
行中止执行。下次外部调用next
方法,继续向下执行,知道碰到yield
时再次中止,直到内部代码所有执行完毕或者碰到return something
(通常不会使用)。每次next
方法返回值为一个对象:函数
{ value: anything, done: boolean }
done
表示内部代码是否所有执行完毕,即表明是否有进行下一次next
方法调用的必要。value
值为yield
后面跟着的表达式的计算值,能够是字符串,数组,函数等基础类型。
须要说明的是,生成器自己并非做为流程控制的,可是能够经过二次封装,来实现流程控制,也就是co
模块。不折腾,不人生,周末看co
模块,好心塞。
QQ:491229492
https://github.com/bornkiller