使用Async,讓你的Node.js程式碼更優雅

longmanma發表於2021-09-09

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的非同步程式設計特性,我們經常會巢狀多個函式,導致程式碼臃腫、維護性差:

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

Async正是解決了這個問題。

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 - 序列執行

series(tasks, callbackopt)

序列執行幾個函式,第一個引數既可以是Array,也可以是Object。

函式1執行完後,不能將引數傳到函式2;故如果需要傳遞引數,不能用series,應用waterfall。

在執行函式過程中,一旦出現錯誤,將中斷;後續的函式將不再執行。

更詳細的資料,請進入官網:

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

2.waterfall - 序列執行,並傳引數

waterfall(tasks, callbackopt)

第一個引數必須是Array,它可以將引數傳遞到下一個函式。

和series函式一樣,在執行函式過程中,一旦出現錯誤,將中斷;後續的函式將不再執行。

更詳細的資料,請進入官網:

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 - 並行執行

parallel(tasks, callbackopt)

顧名思義,就是各任務同時執行,後面宣告的task不需要等待前面task結束,而是立即執行。

需要注意的是,最後的callback得到的引數,是宣告中的最後一個函式傳入的,而不是最後執行的函式。

更詳細的資料,請進入官網:

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

4.parallelLimit - 並行執行,限制數量

parallelLimit(tasks, limit, callbackopt)

parallelLimit函式和parallel類似,只是多了一個引數limit。其作用是隻能同時併發一定數量,而不是無限制併發


參考資料

[1]
[2]



作者:Mike的讀書季
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2730/viewspace-2802666/,如需轉載,請註明出處,否則將追究法律責任。

相關文章