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。  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值