今天在学习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。