js异步执行

本文介绍了JavaScript中的parallel函数,该函数用于并行执行多个任务,不依赖执行顺序。回调函数接收到的数据按tasks声明顺序排列,而非完成顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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 )
{
var a = 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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值