zoukankan      html  css  js  c++  java
  • Node.js学习笔记 02 Implementing flow control

        

    What is flow control?

         和其它语言一样,Node.js 在代码编写时,如何组织代码,如何写出clean code都是不可避免的难点。

         同时,由于Node.js的天然特性(异步,事件驱动),良好的代码组织就更为重要。

         所谓的flow control指的是序列化的执行一个个node.js task的代码组织手段。

         与其它语言一样,任务流可以被组织成两种(串行,并行)如下图:

        

          

    How to flow control?

        一种方式是使用node.js 社区提供的各类第三方模块(),另一种方式就是我们自己编写相关代码。为了工程开发的效率,用第三方库当然是更好的选择,但是为了更好的了解node.js的异步原理,我们可是自己试着实现两种流控制。

    A simple demo of serial flow control

        以下的代码实现了每隔一秒输出不同文字的功能。

    setTimeout(function () {
        console.log("First");
        setTimeout(function () {
            console.log("Sencond");
            setTimeout(function () {
                console.log("Third");
            }, 1000);
        }, 1000);
    }, 1000);

      

        如果用第三方库来实现串行流控制,代码会是这样的:

    var flow = require('nimble');

    flow.series([
        function (callback) {
            setTimeout(function () {
                console.log("First");
                callback();
            }, 1000)
        },
        function (callback) {
            setTimeout(function () {
                console.log("Second");
                callback();
            }, 1000)
        },
        function (callback) {
            setTimeout(function () {
                console.log("Third");
                callback();
            }, 1000)
        }
    ]);

        More code but more maintainable。特别是在串行调用链极长的时候,使用流控制的优势就非常明显了。

        那我们自己要如何实现相关代码呢?下面就是例子:

    var tasks = [
        function (callback) {
            setTimeout(function () {
                console.log("First");
                next();
            }, 1000)
        },
        function (callback) {
            setTimeout(function () {
                console.log("Second");
                next();
            }, 1000)
        },
        function (callback) {
            setTimeout(function () {
                console.log("Third");
                next();
            }, 1000)
        }
    ];

    function next(){
        var currentTask = tasks.shift();
        if (currentTask) {
            currentTask();
        }
    }

    next();

         OK,很简单吧,我们再来看并行。

    Parallel flow control

        以下代码假设我们跑了10个并行任务:

    var taskCounter = 0;
    var taskSum = 10;

    function isTaskCompleted(){
        if (++taskCounter == taskSum) {
            console.log('All job done');       
        }
    }

    function Job(){
        //Lots of code here
        isTaskCompleted();
    }

    for(var i = 0; i < 10; i++)
        Job();

        使用nimble来解决同样的问题:

    var flow = require('nimble');

    flow.parallel([
        Job(),
        Job(),
        Job(),
        Job(),
        Job(),
        Job(),
        Job()
    ]);

      

    Summary

        本文是对flow control做的很精简的总结,信息量不大,大家多多包涵。

     

     
  • 相关阅读:
    selenium设置user-agent以及对于是否是浏览器内核进行反爬
    python-Redis模块常用的方法汇总
    Eight HDU-1043 (bfs)
    4 Values whose Sum is 0 (二分)
    Jmeter的优点是什么?除了轻量级,它和LoadRunner有什么本质区别
    selenuim,qtp,loadrunner,jmeter有何区别,想学个脚本语言python和测试工具应该从哪里入门呢。
    Jquery消息提示插件toastr
    排除Transformation Errors
    Group By Rollup
    Group By Grouping Sets
  • 原文地址:https://www.cnblogs.com/E-WALKER/p/4634036.html
Copyright © 2011-2022 走看看