js异步执行

来源:互联网 发布:中小企业办公软件 编辑:程序博客网 时间:2024/05/14 03:07
 function(path,callback){        fs.readdir(path,function(err,files){       if(err)      {        callback(err);       return;      }      var result=[];     for(var i=0;i<</span>files.length;i++)//这个for想将指定目录下的非文件夹给剔除     //只保留文件夹名到result中    {    fs.stat(path+"/"+files[i],function(err,stats){    if(stats.isDirectory())    result.push(files[i]);    }    callback(null,result);   )   }  }) } 
例子中for 循环里有一个回调函数,在主函数执行过程中回调函数走异步执行。当i等于files.length时,主函数循环跳出,里面的回调函数有可能还在执行过程中。所以result 得不到想要的值。
这里我们需要用到 async模块

waterfall,顾名思义,像流水线一样有序执行,waterfall每个函数产生的值,都将传给下一个函数
另外需要注意的是 waterfall 的 tasks 参数只能是数组类型。当中途有函数出错,其err直接传给最终callback,结果被丢弃,后面的函数不再执行。
async.waterfall([        function(callback){                callback(null, 'one', 'two');        },        function(arg1, arg2, callback){          // arg1 now equals 'one' and arg2 now equals 'two'                callback(null, 'three');        },        function(arg1, callback){                // arg1 now equals 'three'                callback(null, 'done');        }], function (err, result) {   // result now equals 'done'   console.log(result);});
async.waterfall([
function(callback)
{
vara=5;console.log('OK1'); 
setTimeout(function(){callback(null,a*2)},1000);
},
function(data,callback)
{
console.log('OK2');
setTimeout(function(){callback(null,data+7,data)},2000);
},
function(result1,result2,callback)
{
console.log('OK3');
setTimeout(function(){callback(null,result1-9,result2)},3000);
}
],function(err,kk,jj)
{
console.log(kk);console.log(jj);
})

parallel(tasks, [callback])

parallel函数是并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序,示例如下:

async.parallel([        function(callback){                callback(null, 'one');        },        function(callback){                callback(null, 'two');        }],function(err, results){});
parallelLimit(tasks, limit, [callback])
parallelLimit函数和parallel类似,但是它多了一个参数limit。limit参数限制任务只能同时并发一定数量,而不是无限制并发,示例如下:
async.parallelLimit([
        function(callback){                callback(null, 'one');        },        function(callback){                callback(null, 'two');        }],2,function(err, results){        console.log(results);});
series函数 串行执行
它的作用就是按照顺序一次执行。
async.series({        one: function(callback){                callback(null, 1);        },        two: function(callback){                callback(null, 2);        }},function(err, results) {        console.log(results);});
输出:{one: 1, two: 2}
0 0
原创粉丝点击