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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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