上一篇中我們利用array的async.eachSeries,來呼叫兩次自訂的階層運算函數,以示範如何使用async.eachSeries。我必須承認這是一個很蠢的做法,但請各位原諒,畢竟我們只是需要一個範例而已,不是嗎?

Okay,今天這篇輪到async中的flow control,首先來講講最基本的waterfall吧。waterfall顧名思義,就是讓程序的流程像瀑布一樣,由上至下依序的執行下去。async.waterfall最基本的語法如下:

async.waterfall([
 function array
], function(err, rs) {
 exception & final handle
});

在function array中,我們可以將要執行的流程解析為多個 self-defined functions,這些function會由上至下依序的執行。每當一個function執行完畢之後,可以依據執行的結果來選擇流程是要走向exception & final handle,或是跳到function array中的下一個function繼續執行。底下是這些function的最基本宣告語法:

function(done) {
    return done(null);
    // or "return done('error', someObj)" goto last section
}

語法中的done是一個callback函數,用來引接function array中的下一個member,或是跳到async.waterfall的最後一個section。通常如果此function執行成功,且不用傳遞任何參數到下一個member function時,我們就直接使用return done(null)即可。而如果要傳遞任何參數到下一個member function時,則使用return done(null, xxx, ooo)。其中xxx與ooo為我們要傳遞的參數值,而請記得return done()的第一個參數,請保持null,否則程式會判斷符合最後section的err參數,而將流程導向async.waterfall的最後一個section。

底下依然是將前幾天的範例拿出來,同樣不去更改階層運算函數,而是修改主要執行函數部分:

function usingAsyncWaterfall() {
    console.log('===========use EachSeries Start===========');
    async.waterfall([
        function firstRun(done) {
            factorialOperateWithTimeout(10, function(rs) {
                console.log('10! = ' + rs);
                return done(null, rs);
            });
        },
        function secondRun(sum, done) {
            factorialOperateWithTimeout(5, function(rs) {
                console.log('5! = ' + rs);
                rs += sum;
                return done(null, rs);
            });
        }
    ], function(err, rs) {
        if (!err) {
            console.log('sum = ' + rs);
        }
        console.log('===========use EachSeries End===========');
    });
}
usingAsyncWaterfall();

 

好吧,今天就這樣... 明天再來談談async中while的使用吧。

文章標籤
全站熱搜
創作者介紹
創作者 alexlyblue 的頭像
alexlyblue

低敘呢喃

alexlyblue 發表在 痞客邦 留言(0) 人氣(1,907)