使用Async渊跋,讓你的Node.js代碼更優(yōu)雅

Async

Async is a utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript. Although originally designed for use with Node.js and installable via npm install --save async, it can also be used directly in the browser.

在寫Node.js代碼的時候闯狱,由于Node.js的異步編程特性戏售,我們經(jīng)常會嵌套多個函數(shù)乏梁,導致代碼臃腫颂跨、維護性差:

func1() {
    func2() {
        func3() {
            func4(){
                ...
            }
        }
    }
}

Async正是解決了這個問題缰冤。

Async官網(wǎng): http://caolan.github.io/async/


Async實例

async.map(['file1','file2','file3'], fs.stat, function(err, results) {
    // results is now an array of stats for each file
});

async.filter(['file1','file2','file3'], function(filePath, callback) {
  fs.access(filePath, function(err) {
    callback(null, !err)
  });
}, function(err, results) {
    // results now equals an array of the existing files
});

async.parallel([
    function(callback) { ... },
    function(callback) { ... }
], function(err, results) {
    // optional callback
});

async.series([
    function(callback) { ... },
    function(callback) { ... }
]);

Async的幾種方式

1.series - 串行執(zhí)行

series(tasks, callbackopt)

串行執(zhí)行幾個函數(shù)犬缨,第一個參數(shù)既可以是Array,也可以是Object锋谐。

函數(shù)1執(zhí)行完后遍尺,不能將參數(shù)傳到函數(shù)2;故如果需要傳遞參數(shù)涮拗,不能用series乾戏,應(yīng)用waterfall。

在執(zhí)行函數(shù)過程中三热,一旦出現(xiàn)錯誤鼓择,將中斷;后續(xù)的函數(shù)將不再執(zhí)行就漾。

更詳細的資料呐能,請進入官網(wǎng): http://caolan.github.io/async/docs.html#series

async.series({
    one: function(callback){
        callback(null, 1);
    },
    two: function(callback){
        callback(null, 2);
    }
},function(err, results) {
    console.log(results);
});

2.waterfall - 串行執(zhí)行,并傳參數(shù)

waterfall(tasks, callbackopt)

第一個參數(shù)必須是Array抑堡,它可以將參數(shù)傳遞到下一個函數(shù)摆出。

和series函數(shù)一樣,在執(zhí)行函數(shù)過程中首妖,一旦出現(xiàn)錯誤偎漫,將中斷;后續(xù)的函數(shù)將不再執(zhí)行有缆。

更詳細的資料象踊,請進入官網(wǎng):http://caolan.github.io/async/docs.html#waterfall

async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
        // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
    // result now equals 'done'
});

3.parallel - 并行執(zhí)行

parallel(tasks, callbackopt)

顧名思義,就是各任務(wù)同時執(zhí)行棚壁,后面聲明的task不需要等待前面task結(jié)束杯矩,而是立即執(zhí)行。

需要注意的是袖外,最后的callback得到的參數(shù)史隆,是聲明中的最后一個函數(shù)傳入的,而不是最后執(zhí)行的函數(shù)曼验。

更詳細的資料泌射,請進入官網(wǎng):http://caolan.github.io/async/docs.html#parallel

async.parallel([
    function(callback) {
        setTimeout(function() {
            callback(null, 'one');
        }, 200);
    },
    function(callback) {
        setTimeout(function() {
            callback(null, 'two');
        }, 100);
    }
],
// optional callback
function(err, results) {
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

4.parallelLimit - 并行執(zhí)行头镊,限制數(shù)量

parallelLimit(tasks, limit, callbackopt)

parallelLimit函數(shù)和parallel類似,只是多了一個參數(shù)limit魄幕。其作用是只能同時并發(fā)一定數(shù)量,而不是無限制并發(fā)


參考資料

[1] nodejs之a(chǎn)sync異步編程
[2] async官網(wǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颖杏,一起剝皮案震驚了整個濱河市纯陨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌留储,老刑警劉巖翼抠,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異获讳,居然都是意外死亡阴颖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門丐膝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來量愧,“玉大人,你說我怎么就攤上這事帅矗≠怂啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵浑此,是天一觀的道長。 經(jīng)常有香客問我,道長澄惊,這世上最難降的妖魔是什么牺弄? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蒲犬,結(jié)果婚禮上朱监,老公的妹妹穿的比我還像新娘。我一直安慰自己暖哨,他們只是感情好赌朋,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著篇裁,像睡著了一般沛慢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上达布,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天团甲,我揣著相機與錄音,去河邊找鬼黍聂。 笑死躺苦,一個胖子當著我的面吹牛身腻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匹厘,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼嘀趟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了愈诚?” 一聲冷哼從身側(cè)響起她按,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炕柔,沒想到半個月后酌泰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡匕累,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年陵刹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢嘿。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡衰琐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出际插,到底是詐尸還是另有隱情碘耳,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布框弛,位于F島的核電站辛辨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瑟枫。R本人自食惡果不足惜斗搞,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慷妙。 院中可真熱鬧僻焚,春花似錦、人聲如沸膝擂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽架馋。三九已至狞山,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叉寂,已是汗流浹背萍启。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勘纯。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓局服,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驳遵。 傳聞我的和親對象是個殘疾皇子淫奔,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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