天天看點

不确定函數數目使用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);
        });