今天在學習async模塊的auto方法,發現好多例子都是錯的,學習記錄如下
auto函數比較靈活,它不像series或者waterfall或者parallel這種只能使用並行或者順序的方式。
auto中的函數可以並行也可以串行傳遞參數。
直接上代碼:
var async = require('async');
var funclist = {
//這裏func1和func2的執行可能是並行的
//不引用其它函數時,只接收一個回調函數形參
func1: function (callback) {
console.log('func1執行,傳入值func1-1,func1-2')
callback(null, 'func1-1','func1-2');//這裏會把兩個參數封裝成一個數組[],放入結果對象中
},
//這裏如果傳一個result的形參,會打印undefine
func2: function (callback,results) {
console.log('func2執行')
console.log("func2 result: ",results);//此處打印undefine
callback(null, { "puncha": "during" });//對象放入結果對象中
},
//在順序執行的函數,寫入一個數組,數組的元素順序爲順序調用的函數名,最後一個爲當前的回調
//fun3調用了func2,此處的回調函數有2個參數, result爲結果對象當前的值,callback爲回調函數
func3: ["func2", function (result,callback ) {
console.log('結果對象中的func1: ',result['func1']);
console.log('結果對象中的func1 用.調用 : ',result.func1);
console.log('結果對象中的func2:',result.func2);
console.log('func3在func2執行後執行,傳入值 3');
console.log("func3 result: ",result);
callback(null, 3);
}],
//func4調用func3
func4: ["func3", function (results,callback) {
console.log('func4在func3執行後執行,總體執行結果爲:')
console.log("func4 result: ",results);
callback(null);
}],
//func5調用func1、func2
func5: ["func1","func2", function (results,callback) {
console.log('func5在func1和func2執行後執行,總體執行結果爲:')
console.log("func5 result: ",results);
callback(null);
}]
};
async.auto(funclist);
這段代碼抽象一下差不多是這樣的:
{
func1,//func1和func2可以並行,因爲之間沒有依賴
func2,
async.waterfall(func2,func3),//func2執行完了執行func3
async.waterfall(func3,func4),//func3執行完了執行func4
async.waterfall(func1,func2,func5)//func1、func2執行完了執行func3
}
先來看一下執行的結果:
func1執行,傳入值{name:123}
func2執行
func2 result: undefined
結果對象中的func1: [ 'func1-1', 'func1-2' ]
結果對象中的func1 用.調用 : [ 'func1-1', 'func1-2' ]
結果對象中的func2: { puncha: 'during' }
func3在func2執行後執行,傳入值 3
func3 result: { func1: [ 'func1-1', 'func1-2' ], func2: { puncha: 'during' } }
func5在func1和func2執行後執行,總體執行結果爲:
func5 result: { func1: [ 'func1-1', 'func1-2' ],
func2: { puncha: 'during' },
func3: 3 }
func4在func3執行後執行,總體執行結果爲:
func4 result: { func1: [ 'func1-1', 'func1-2' ],
func2: { puncha: 'during' },
func3: 3,
func5: undefined }
auto中的函數callback的結果,會被存在一個結果對象中,這個結果的key是每個函數的函數名,value是函數callback的結果。
auto中的回調函數,如果不存在順序依賴其它函數執行的情況(即可並行的函數),只接收一個回調函數的形參,func2中嘗試給一個results的形參去取結果對象中的值,打印結果爲undefined。
再看一下func1,回調函數callback(null,'func1-1','func1-2') 這裏第一個參數爲null,應該是給auto預留調用位置,後面不管callback多少個參數,都屬於func1的結果,因此它會被封裝成一個數組,[ 'func1-1', 'func1-2' ]
如果存在順序調用,需要使用數組的寫法func3那種,數組的元素順序爲順序調用的函數名,最後一個爲當前的回調。且這個時候的回調函數,第一個參數爲當前的結果對象(即當前回調函數可以利用前序執行的函數的結果),第二個參數爲回調函數的形參。!!!順序不能反!!!
從打印的結果可以看到,“結果對象”中的數據是不斷追加的,func5在func3後執行,所以func5打印的結果中有3。