从零学习node.js之详解异步控制工具async(八)

2020-06-17 05:49:04易采站长站整理
最终回调函数,当集合处理完毕后调用此函数,传递两个参数err和result,result为之前处理后的所有的结果的集合

注意:中间处理函数iteratee对coll中的每一项都是并发处理的,因此并不能保证iteratee按照顺序完成。不过,如果coll是个数组,最后的结果集results会按照coll中的顺序排列;如果coll是个集合(Object)类型,results会是数组类型,结果将大致按照coll的键的顺序排列(但是不同在不同的JavaScript引擎中会有可能发生变化)。

我们来举个例子,使用map获取几个文件中的内容:


var files = ['./file/cnode_1.txt', './file/cnode_2.txt', './file/cnode_3.txt'];

// 读取文件内容
// 第1个参数 文件名称列表的数组
// 第2个参数 传入数组中的每一项和回调函数
// 第3个参数 results为所有结果的集合
async.map(files, function(file, cb){
fs.readFile(file, 'utf-8', function(err, data){
cb(err, data);
})
}, function(err, results){
console.log( results );
})

而且,如果中间的处理函数比较大,不想写在map中,也可以单独写成一个函数,然后传递进去,不过参数传递还是要符合规则的:


var files = ['./file/cnode_1.txt', './file/cnode_2.txt', './file/cnode_3.txt'];

var read = function(file, cb){
fs.readFile(file, 'utf-8', function(err, data){
cb(err, data);
})
}
async.map(files, read, function(err, result){
console.log( result );
})

这里还有一个mapLimit,可以传递一个参数limit,用来限制并发的数量:

mapLimit(coll, limit, iteratee, callbackopt) 


// 并发数量为2
async.mapLimit(files, 2, read, function(err, result){
console.log( result );
})

同时,集合类中还有其他的方法,我们也稍微了解下:

each : 与map类似,但是最后的回调函数里没有results,each只循环不负责处理结果
every : 中间处理函数iteratee的参数(err, boolean)需要传递一个boolean值,若所有选项的结果都为true,则results为true
some : 与every类似,只是只要其中一个选项的结果为true,则results为true
filter : 对coll进行筛选,筛选出结果为true的结果
reject : 与filter正好相反,筛选出结果为false的结果
concat : 将每个异步操作的结果合并为一个数组

2.2 流程控制类

上面的集合类是对一个集合进行相同的处理,集合中的每一项都处理完后,再对结果进行回调处理。而多个回调方法执行时,则需要对这几个回调方法进行控制了。

多个回调方法执行时,通常有这么几个流程: