async模塊auto函數使用

今天在學習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。  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章