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

2020-06-17 05:49:04易采站长站整理

前言

大家在编写异步程序时,最头痛的就是不知道结果什么时候返回给我们,然后执行后面的操作,很多时候只能把后面的操作放到返回成功的函数里,或者使用计数器等方法。

比较典型的两个就是:后面的操作需要依赖上一个异步操作的结果;多个异步操作并行执行,都执行完成后再执行接下来的操作。

这两个操作中,第一个异步的程序我们可能会写成这样:


db.select(SQL1, function(res1){
db.delete(SQL2, function(res2){
db.insert(SQL3, function(res3){
// ...
})
})
});

将后面的操作写到执行成功后的回调函数里。第2个并行的异步操作,可以使用计数器的方法,每个异步调用成功时,计数器加1,当所有的异步都调用成功后,再接着执行:


var count = 0;
var success = function(){
count++;
if(count>=3){
console.log('执行完毕...');
}
}

var select = function(){
db.select(sql, function(res){
success();
})
}
var select2 = function(){
db.select(sql, function(res){
success();
})
}
var select3 = function(){
db.select(sql, function(res){
success();
})
}
select();
select2();
select3();

这些编写方式非常麻烦,而且代码逻辑比较混乱,调试起来也很不方便。那么就要用到异步控制的利器async了。

介绍

async的作用是进行流程的控制,而且提供了非常多的方法可供调用。

这些方法可以分为三大类:

集合类(Collections)
流程控制类(Control Flow)
工具类(Utils)

下面我们从这三个分类里分别挑出几个方法进行讲解。

二、函数介绍

async中提供了非常多的方法可供使用,我们仅仅是讲解其中几个比较有代表性的,其他的可以访问官方文档:http://caolan.github.io/async/docs.html。

2.1 集合类

集合类中的方法主要有some, ‘map’, ‘each’, ‘every’等,这些方法是对数组或组合进行某个相同的操作后,统一执行回调函数。

我们以map为例,map对集合中的每一个元素,执行某个相同的异步操作,得到结果。所有的结果将汇总到最终的callback里。
使用方法,map接收三个参数,分别是:

参数名称类型说明
colliterateecallback
Array | Iterable | Objectfunctionfunction
需要处理数组,集合或其他可迭代的类型迭代方法,用来对集合中的每一项进行处理。该方法接收两个参数(item, callback);item为集合中的每一项, callback为回调函数。callback需要带有err(有时可能为null)和处理后的数据,callback(err, data)