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做的很精简的总结,信息量不大,大家多多包涵。

 

Node.js学习笔记 02 Implementing flow control的更多相关文章

  1. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  2. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  3. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  4. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  5. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  6. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

  7. Node.js学习笔记(一)

    1.回调函数 node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数. 例: setTimeout(function(){ console.log('callback is calle ...

  8. Node.js学习笔记(一):快速开始

    最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...

  9. Node.js学习笔记(一)基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

随机推荐

  1. HDU1213

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1213 #include<stdio.h> #include<algorithm&g ...

  2. Win2008远程多用户登陆的配置方法 另附详细设置: Windows server 2008 R2实现多用户远程连接

    Win2008远程多用户登陆的配置方法     在使用Windows 2008远程登录功能时,如果需要进行多用户登录,可以采用以下配置方法: 首先要启用远程桌面这一功能:右击“我的电脑”→ 属性 → ...

  3. 慕课网-安卓工程师初养成-1-1 Java简介

    来源 http://www.imooc.com/video/1430 主要内容 Java平台应用 核心概念:JVM,JDK,JRE 搭建Java开发环境 使用工具开发安卓程序 经验技巧分享 Java历 ...

  4. 【SSH 1】SSH框架的基本理解

    导读:在结束了BS之后,接触到的第一个项目算是网上商城了.这次用到了和之前都不一样的框架:SSH.这个项目就和之前学牛腩一样,有着里程碑的意义.当然了,这也就意味着,什么都是新鲜的,接触到的东西,有时 ...

  5. CLRS:sorting in linear time O(n)

    //intput array A,output array result.   count array count . //all the elements is in te range of 0~k ...

  6. 【转】DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)

    这两天正在学习FPGA如何控制DDR3的读写,找到一篇个人感觉比较有意义的文章,可以对DDR的内部结构有一个初步的了解.原文出处:http://blog.chinaunix.net/uid-28458 ...

  7. C# Socket网络编程精华篇(转)

    我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本 ...

  8. Loadrunner:POP3协议录制收信,使用foxmail录制到的脚本为空

    以下录制方法使得录制到的脚本为空: (1)打开Virtual User Generator,点击“新建Vuser脚本”,在弹出的向导页面,选择“新建单协议脚本”,选择“POP3”协议,并确定 (2)在 ...

  9. Unieap3.5-JS常用方法

    引用js文件 获得当前主体 getDimensionId(); 当前单位类型(网点,分部,总部) getUnitType(); 数据库日期 newOracleDate(); unieap.byId(& ...

  10. 网站屏蔽指定ip

    修改.htaccess文件 Order Deny,Allow     //开启屏蔽Deny from 124.64.242.117  //要屏蔽的ip