上一篇中我們利用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的使用吧。
