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 );
setTimeout ( function (){ callback ( null , a * 2 )}, 1000 );
},
function ( data , callback )
function ( data , callback )
{
console
.
log
(
'OK2'
);
setTimeout
(
function
(){
callback
(
null
,
data
+
7
,
data
)},
2000
);
},
function ( result1 , result2 , callback )
function ( result1 , result2 , callback )
{
console
.
log
(
'OK3'
);
setTimeout
(
function
(){
callback
(
null
,
result1
-
9
,
result2
)},
3000
);
}
], function ( err , kk , jj )
], 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}