网上给的demo都是确定函数a,b的方式使用async.parallel或者async.series。实际需求中,不确定需要处理多少个函数,但是却又需要等这些函数都处理完,流程才能结束。
要解决这个问题只能,通过async.parallel的函数参数下手。幸运的是,async.parallel第一个函数是个数组,数组中保存着需要执行的函数列表,那么问题简单了,只需要将不确定数目的函数列表,通过for循环写入到数组中。再将这个输出传入async.parallel,问题解决。附上代码。
funcList = [] //需要处理的函数列表数组
var fire = function (hzname, firecallback) {
logger.trace('得到徽章:' + "userid: " + obj.userid + "hzname:" + hzname);
//修改redis, 修改sqlserver
let a = function (callback) {
dbmssql.querySql("insert into GameUserBadge(UserID,BadgeID,State,Prograss,TargetPro) VALUES(" + obj.userid + "," + hz.id + ",1,0," + hz.value + ")", "", function (err, result) {
if (err) {
// 回调给下一个函数
logger.info("数据库写入失败");
logger.info("db w err: " + "insert into GameUserBadge(UserID,BadgeID,State,Prograss,TargetPro) VALUES(" + obj.userid + "," + hz.id + ",1,0," + hz.value + ")");
callback(errList.sqlservererr, "insert into GameUserBadge(UserID,BadgeID,State,Prograss,TargetPro) VALUES(" + obj.userid + "," + hz.id + ",1,0," + hz.value + ")");
}
else {
// 回调给下一个函数
logger.info("数据库写入成功");
callback(null, "mssql ok");
}
});
};
//写入redis
let b = function (callback) {
//redisdb.hincrby(hashName, HZexits(hz.id), objItem.d, function (err, result) {
//let insrdsresult = rdsresult + obj.data.d;
redisdb.hset(hashName, HZexits(hz.id), hz.value, function (err, result) {
if (err) {
logger.info("redis w err: " + hashName + HZexits(hz.id) + err);
logger.info("redis写入失败");
logger.info(err);
callback(errList.rediserr, hashName + HZexits(hz.id) + err);
}
else {
logger.info("redis写入成功");
// 回调给下一个函数
callback(null, "redis ok");
}
})
};
async.parallel([a, b], function (err, results) {
if (err != null) {
return firecallback(err, results);
}
let array = {
act: returnmsgid.addhz,
d: hz.id
}
firecallback(null, array)
});
};
//涉及需要修改的徽章名字 其中HZ_BADGE_ACT_LIST[actstring]不确定数目
for (var key in HZ_BADGE_ACT_LIST[actstring]) {
let hzname = HZ_BADGE_ACT_LIST[actstring][key].toString(); //徽章名字 HZ_TSYS
let hz = HZ_LIST[hzname];
if (hz.externDealer) {
hzname = hz.externDealer()
if (!hzname)
return callbackall(null, null);
}
funcList.push(function (cb) { fire(hzname, cb) })
}
async.parallel(funcList, function (err, results) {
//全部处理完毕
if (err != null) {
return callbackall(err, results);
}
callbackall(null, results);
});