首先,使用Asycn模塊需要安裝,它不是node自帶的。其次,該模塊有大約20多個流程控制方法,我們在這里僅分析常用的series, parallel, waterfall, auto這四種,並且盡量從原理上進行分析。
首先是series。顧名思義,它是控制異步函數按照串行順序執行,只有前一個執行完畢,才能執行下一個異步調用。回調函數cb有兩個參數:error和data,而它們可以為null。回調函數舉個例子:
async.series([function(cb){ setTimeout(function(){ cb(null,1); },1000) },function(cb){ setTimeout(cb,1000,null,2); }],function(err,result){ //result是每個回調函數傳進來的data參數,result=[1,2] if (err) console.error(err); else console.log(result); })
parallel的用法和series類似。只是數組中的函數是並行執行,parallel的總時間取決於運行時間最長的函數。而最終的回調函數里result的值是按照數組中函數的順序排列的。
async.parallel([function(cb){ setTimeout(function(){ cb(null,1); },1000) },function(cb){ setTimeout(cb,1000,null,2); }],function(err,result){ //result=[1,2] if (err) console.error(err); else console.log(result); })
waterfall用法上有區別。waterfall中cb的參數data直接傳給下一個函數,最后一個函數cb的data參數直接傳給回調函數的result。
async.waterfall([function(cb){ setTimeout(function(){ cb(null,1); },1000) },function(data,cb){ setTimeout(cb,1000,null,data+"+"+"2"); }],function(err,result){ //result = "1+2" if (err) console.error(err); else console.log(result); })
以上都是API用法,下面我們試着實現一下原理。
