美文网首页
Node.js中异步逻辑的串行化流程控制

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

作者: Mike的读书季 | 来源:发表于2016-09-22 14:38 被阅读483次

    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中异步逻辑的串行化流程控制

          本文链接:https://www.haomeiwen.com/subject/fljzettx.html