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