網上給的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);
});