鹦哥

导航

 

      首先,使用Asycn模块需要安装,它不是node自带的。其次,该模块有大约20多个流程控制方法,我们在这里仅分析常用的series, parallel, waterfall, auto这四种,并且尽量从原理上进行分析。

      首先是series。顾名思义,它是控制异步函数按照串行顺序执行,只有前一个执行完毕,才能执行下一个异步调用。回调函数cb有两个参数:error和data,而它们可以为null。回调函数举个例子:

async.series([function(cb){
    setTimeout(function(){
        cb(null,1);
    },1000)
},function(cb){
    setTimeout(cb,1000,null,2); 
}],function(err,result){  //result是每个回调函数传进来的data参数,result=[1,2]
    if (err) console.error(err);
    else console.log(result);
})

        parallel的用法和series类似。只是数组中的函数是并行执行,parallel的总时间取决于运行时间最长的函数。而最终的回调函数里result的值是按照数组中函数的顺序排列的。

async.parallel([function(cb){
    setTimeout(function(){
        cb(null,1);
    },1000)
},function(cb){
    setTimeout(cb,1000,null,2);
}],function(err,result){  //result=[1,2]
    if (err) console.error(err);
    else console.log(result);
})

        waterfall用法上有区别。waterfall中cb的参数data直接传给下一个函数,最后一个函数cb的data参数直接传给回调函数的result。

async.waterfall([function(cb){
    setTimeout(function(){
        cb(null,1);
    },1000)
},function(data,cb){
    setTimeout(cb,1000,null,data+"+"+"2");
}],function(err,result){  //result = "1+2"
    if (err) console.error(err);
    else console.log(result);
})

     以上都是API用法,下面我们试着实现一下原理。

posted on 2016-11-03 21:55  鹦哥  阅读(2492)  评论(0编辑  收藏  举报