Node.js中异步逻辑的串行化流程控制

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,578评论 2 41
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,041评论 2 58
  • 10.22 1.52次加速,助你成为“超级个体” 2.热题思考:你是一辆什么车? 职业发展计划:目标-自我-路径...
    Sim2阅读 109评论 0 0
  • 几年前,我还不到20岁,但某一天我突然意识到未来我有可能成为剩女,那一瞬间突然感觉很悲凉。毕竟也不到20岁,这个想...
    收藏回忆的宇航员阅读 305评论 0 2
  • 稍不注意,周末的时间就瞬间从自己的屁股底下流逝,从晚饭想着看一集《the grand tour》就干别的,到后来又...
    谬炎阅读 505评论 2 2