Async是一個流程控制工具包,提供了直接而強大的異步功能。基於Javascript爲Node.js設計,同時也能夠直接在瀏覽器中使用。Async提供了大約20個函數,包括經常使用的
map, reduce, filter, forEach等,異步流程控制模式包括,串行(series),並行(parallel),瀑布(waterfall)等。
https://github.com/caolan/asyncgit
串行無關聯
串行有關聯
並行無關聯
智能控制github
var async = require('async'); console.time('series'); async.series({ one: function(callback) { callback(null, 'one');//callback('i am err','one');異常處理 }, two: function(callback) { callback(null, 'two'); }, }, function(error, result) { //最後結果 console.log('error: ' + error); console.log('result: ' + result); console.timeEnd('series'); }); // error: null // result: [object Object] // series: 4.472ms
async.waterfall([ myFirstFun, mySecondFun, myLastFun ],function(err,result) { // result回調函數 // result 至關於tasks數組中最後一個函數(myLastFun)的返回值done console.log(result); // myLastFun }) function myFirstFun(callback) { callback(null,'one','two'); } function mySecondFun(arg1,arg2,callback) { // arg1 至關於 'one' ,arg2 至關於 'two' callback(null,'three'); } function myLastFun(arg1,callback) { // arg1 至關於 'three' callback(null,'done'); }
async.parallel([ function(callback) { setTimeout(function() { callback(null, 'one'); }, 200); }, function(callback) { setTimeout(function() { callback(null, 'two'); }, 100); } ],function(err, results) { console.log(result)} );
4.async.auto:智能控制
以上都是純串行傳並行,可是當一個場景裏,須要使用串行也須要使用並行的時候,雖然分別寫能解決,可是效率不是很高,維護性也不是很好,auto能夠解決這一問題。
以下場景:
從某處取得數據
在硬盤上創建一個新的目錄
將數據寫入到目錄下某文件
發送郵件,將文件以附件形式發送給其它人。
能夠知道1與2能夠並行執行,3須要等1和2完成,4要等3完成。
使用auto來解決數組
var async = require('async'); console.time('auto'); async.auto({ getData: function(callback) { setTimeout(function() { console.log('1.1: got data'); callback(null, 'mydata'); }, 300); }, makeFolder: function(callback) { setTimeout(function() { console.log('1.1: made folder'); callback(null, 'myfolder'); }, 200); }, writeFile: ['getData', 'makeFolder', function(callback) { setTimeout(function() { console.log('1.1: wrote file'); callback(null, 'myfile'); }, 300); }], emailFiles: ['writeFile', function(callback, results) { console.log('emailed file: ', results.writeFile); callback(null, results.writeFile); }] }, function(err, results) { console.log('err: ', err); console.log('results: ', results); console.timeEnd('auto'); }); 結果以下 1.1: made folder 1.1: got data 1.1: wrote file emailed file: myfile err: null results: { makeFolder: 'myfolder', getData: 'mydata', writeFile: 'myfile', emailFiles: 'myfile' } auto: 650.972ms