0.Nimble
在Node.js中,异步编程技术让我们可以同时处理多个任务,这也是Node.js适用于高并发需求的原因之一。
不过有时候,我们仍然需要强调执行的顺序,这就导致我们会不断地将回调函数嵌套进第一个调用的函数,导致整段代码嵌套得很深。举个例子,我们要读取5个文件,且必须按顺序读取。一般情况下,我们会这样书写:
var fs = require('fs');
var exc = function(){
fs.readFile(path1, function(){
fs.readFile(path2, function(){
fs.readFile(path3, function(){
fs.readFile(path4, function(){
console.log("Finished Reading!");
});
});
});
});
};
exc();
为了让结构更为清晰,我省略了很多判断条件、回调函数的参数,仅保留了基本的嵌套结构。
从这个结构可以看出来,假如我们还要读取更多的文件,那么这样的嵌套还会持续下去;试想一下,如果某个流程有几十个函数,最终的代码会是恐怖的嵌套,满屏的缩进;这种代码的可读性和可维护性是很差的。
那么能不能像书写普通函数一样依次书写要执行的函数呢?Nimble等工具提供了这样的方法。你可以通过npm安装它:
npm install nimble
然后就可以这样做:
var fs = require('fs');
var flow = require('nimble');
flow.series([
function(callback) {
fs.readFile(path1, function(){
callback();
});
},
function(callback) {
fs.readFile(path2, function(){
callback();
});
},
function(callback) {
fs.readFile(path3, function(){
callback();
});
},
function(callback) {
fs.readFile(path4, function(){
callback();
});
},
// ....
], function(){console.log("Finished Reading!");});
从代码量上看,nimble并不占优势,但在可读性和可维护性上,完爆上面实例几条街。
关于Nimble的内容这里不再介绍,有兴趣的朋友可移步这里:nimble
2.Nimble的实例
2.1 部署Express
如果不知道如何部署,可参照: 部署Express
2.2 安装Nimble
npm install nimble
2.3 Demo
在routes/index.js文件中把"/"的路由更改为:
router.get('/', function(req, res, next) {
flow.series([
function(callback){
setTimeout(function(){
console.log('This is Function 1');
callback();
},
1000);
},
function(callback){
setTimeout(function(){
console.log('This is Function 2');
callback();
},
1000);
},
function(callback){
setTimeout(function(){
console.log('This is Function 3');
callback();
},
1000);
},
], function(){console.log("Finished!!!");
});
console.log('This function is not in flow!');
res.render('index', { title: 'Express' });
});
这里我用setTimeout()来模拟异步函数,队列里共有3个函数,每个函数都要等待1秒钟才能执行。
运行应用:
supervisor bin/www
或
node bin/www
在浏览器输入127.0.0.1:3000即可看到如下结果:
Nimble的实例更多资料可参考:
http://blog.rajatpandit.com/
参考书籍:《Node.js实战》,Mike Cantlon, Marc Harter, T.J.Holowaychuk, Nathan Rajlich著,人民邮电出版社
原创文章,未经许可,请勿转载
作者:Mike的读书季
日期:2016.09.22
QQ:1139904786
Blog:http://blog.csdn.net/kkdestiny
网友评论