Node.js中異步邏輯的串行化流程控制

0.Nimble

在Node.js中,異步編程技術(shù)讓我們可以同時處理多個任務(wù),這也是Node.js適用于高并發(fā)需求的原因之一。

不過有時候矫夯,我們?nèi)匀恍枰獜?qiáng)調(diào)執(zhí)行的順序,這就導(dǎo)致我們會不斷地將回調(diào)函數(shù)嵌套進(jìn)第一個調(diào)用的函數(shù)吊洼,導(dǎo)致整段代碼嵌套得很深训貌。舉個例子,我們要讀取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();

為了讓結(jié)構(gòu)更為清晰综液,我省略了很多判斷條件款慨、回調(diào)函數(shù)的參數(shù),僅保留了基本的嵌套結(jié)構(gòu)谬莹。
從這個結(jié)構(gòu)可以看出來檩奠,假如我們還要讀取更多的文件,那么這樣的嵌套還會持續(xù)下去附帽;試想一下埠戳,如果某個流程有幾十個函數(shù),最終的代碼會是恐怖的嵌套蕉扮,滿屏的縮進(jìn)整胃;這種代碼的可讀性和可維護(hù)性是很差的。

那么能不能像書寫普通函數(shù)一樣依次書寫要執(zhí)行的函數(shù)呢慢显?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并不占優(yōu)勢荚藻,但在可讀性和可維護(hù)性上,完爆上面實例幾條街洁段。
關(guān)于Nimble的內(nèi)容這里不再介紹应狱,有興趣的朋友可移步這里: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()來模擬異步函數(shù)祠丝,隊列里共有3個函數(shù)疾呻,每個函數(shù)都要等待1秒鐘才能執(zhí)行。

運行應(yīng)用:

supervisor bin/www

node bin/www

在瀏覽器輸入127.0.0.1:3000即可看到如下結(jié)果:

Nimble的實例

更多資料可參考:
http://blog.rajatpandit.com/


參考書籍:《Node.js實戰(zhàn)》写半,Mike Cantlon, Marc Harter, T.J.Holowaychuk, Nathan Rajlich著岸蜗,人民郵電出版社


原創(chuàng)文章,未經(jīng)許可叠蝇,請勿轉(zhuǎn)載
作者:Mike的讀書季
日期:2016.09.22
QQ:1139904786
Blog:http://blog.csdn.net/kkdestiny

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璃岳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铃慷,老刑警劉巖单芜,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犁柜,居然都是意外死亡洲鸠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門馋缅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扒腕,“玉大人,你說我怎么就攤上這事股囊⊥嗄洌” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵稚疹,是天一觀的道長居灯。 經(jīng)常有香客問我,道長内狗,這世上最難降的妖魔是什么怪嫌? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮柳沙,結(jié)果婚禮上岩灭,老公的妹妹穿的比我還像新娘。我一直安慰自己赂鲤,他們只是感情好噪径,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著数初,像睡著了一般找爱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泡孩,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天车摄,我揣著相機(jī)與錄音,去河邊找鬼仑鸥。 笑死吮播,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眼俊。 我是一名探鬼主播意狠,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疮胖!你這毒婦竟也來了摄职?” 一聲冷哼從身側(cè)響起誊役,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谷市,沒想到半個月后蛔垢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡迫悠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年鹏漆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片创泄。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡艺玲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞠抑,到底是詐尸還是另有隱情饭聚,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布搁拙,位于F島的核電站秒梳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箕速。R本人自食惡果不足惜酪碘,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盐茎。 院中可真熱鬧兴垦,春花似錦、人聲如沸字柠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窑业。三九已至钦幔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間数冬,已是汗流浹背节槐。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工搀庶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拐纱,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓哥倔,卻偏偏與公主長得像秸架,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咆蒿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Node.js是目前非扯ǎ火熱的技術(shù)蚂子,但是它的誕生經(jīng)歷卻很奇特。 眾所周知缭黔,在Netscape設(shè)計出JavaScri...
    w_zhuan閱讀 3,617評論 2 41
  • Node.js是目前非呈尘ィ火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特馏谨。 眾所周知别渔,在Netscape設(shè)計出JavaScri...
    Myselfyan閱讀 4,076評論 2 58
  • 10.22 1.52次加速,助你成為“超級個體” 2.熱題思考:你是一輛什么車惧互? 職業(yè)發(fā)展計劃:目標(biāo)-自我-路徑...
    Sim2閱讀 138評論 0 0
  • 幾年前哎媚,我還不到20歲,但某一天我突然意識到未來我有可能成為剩女喊儡,那一瞬間突然感覺很悲涼拨与。畢竟也不到20歲,這個想...
    收藏回憶的宇航員閱讀 327評論 0 2
  • 稍不注意,周末的時間就瞬間從自己的屁股底下流逝箩朴,從晚飯想著看一集《the grand tour》就干別的岗喉,到后來又...
    謬炎閱讀 577評論 2 2