不确定函数数目使用nodeJS的async.parallel方法

网上给的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);
        });

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值