Node.js學習筆記 02 Implementing 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做的很精簡的總結,資訊量不大,大家多多包涵。