首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新手async.waterfall

新手async.waterfall
EN

Stack Overflow用户
提问于 2015-07-21 16:36:07
回答 2查看 190关注 0票数 2

我试过使用异步。我有一个带async.waterfall的rout函数。第一个函数调用一个外部函数并在usersData中获取第二个函数中的所有用户,通过async.each调用一个外部函数来搜索每个用户的信息。我希望再次传递带有新闻值的usersData到第3函数。在第三个函数中,目前,我有一个async.each,我查看每个用户的数据。我的问题

1)在第二个函数中,我不为每个用户获取信息。2)第3次函数在第2次调用之前调用,我不获取新的数据,谢谢

代码语言:javascript
复制
router.post('/launch',function(req,res,next){
    async.waterfall([
        function(cb){
          // fetch the global users  
          fetchUsers(usersData,cb);
        },
        function(usersData,cb){
            async.each(usersData,
                function(userdata,cb){
                    // fetch other data for each user
                    calcBalance(userdata, cb);
                },function(err){
                    cb(err,usersData);
                });
        },
        function(usersData,cb){
            async.each(usersData,
                function(userdata,cb) {
                    //watch the info with the news data
                    console.log(' 2 '+ JSON.stringify(userdata));
                    //console.log(3);
                }
            );
        },
        ],
        function(err,results){
            console.log('Fin' + JSON.stringify(results));
            res.render('synchros',{launch:'end'},results);
        });
    res.render('synchros',{launch:'end'});
});

function calcBalance(userData,cb){
    var user_id=userData.id,
        resultCalcBalance=0,
        cats_id=[3,4,6],
        tabData={};
    async.each(cats_id,function(cat_id,cb){
    switch (cat_id) {
        case 3:
            var comp = "<=";
            break;
        case 4:
            var comp = "<=";
            break;

        case 6:
            var comp = "<";
            break;
    }// fin du switch

        var myquery = "select blabla+
        //console.log(calcul_balance);
        connectionMysql.query(myquery, function (err, rows, fields,cb) {
            if (err) {
                console.log('Error ' + err);
                cb(err);
            }
            else if (rows.length != 0) {
                if (rows != 0) {
                }// end if
                else {

                }// end else
        }); // end connectionMysql
    },function(err){
        cb(err,userData); // ?? I send the data here
    });
    cb(null, userData); // ?? I send the data here ??
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-21 18:12:25

我恢复了,修复了一些排版,并更改了回调的名称。我将第二个async.each更改为async.map,因为您正在处理一个数组,以获得每项一个结果的集合。

第一个问题在第二行到最后一行。你从calcBalance打回来太早了。另一个潜在的问题是第二个瀑布函数(以及在cb中)有一个模糊的回调名calcBalance。

最后,您从未在第三个瀑布函数中运行async.each回调,如果您退出它,这是偶然的。

您仍然没有从一个数据库查询中报告成功,所以如果它正常工作,就需要调用done()。您还可能希望在数据库调用中使用async.map,这将使您能够像done(null, balanceForCategory)一样组装结果。

代码语言:javascript
复制
router.post('/launch', function(req, res, next){
  async.waterfall([
    function(done){
      // fetch the global users
      fetchUsers(usersData,done);
    },
    function(usersData,done){
      async.map(usersData, function(userdata, done2){
        // fetch other data for each user
        calcBalance(userdata, done2);
      },function(err, results){
        done(err,usersData);
      });
    },
    function(usersData, done){
      async.each(usersData, function(userdata, done2) {
        //watch the info with the news data
        console.log(' 2 '+ JSON.stringify(userdata));
        //console.log(3);
      }, done)
    },
  ],
  function(err, results){
    // results will be undefined because we called done() from the above async.each
    console.log('Fin' + JSON.stringify(results));
    res.render('synchros', {launch:'end'}, results);
  }); // end of async.each
}); // end of router.post()

function calcBalance(userData, callback){
  var user_id=userData.id,
  resultCalcBalance=0,
  cats_id=[3,4,6],
  tabData={};
  async.each(cats_id, function(cat_id, done){
    switch (cat_id) {
    case 3:
        var comp = "<=";
        break;
    case 4:
        var comp = "<=";
        break;

    case 6:
        var comp = "<";
        break;
    }// fin du switch

    var myquery = "select blabla";
    //console.log(calcul_balance);
    connectionMysql.query(myquery, function (err, rows, fields, queryCb) { // what is this queryCb param?
      if (err) {
        console.log('Error ' + err);
        queryCb(err); // This will callback whatever mySql passed in as queryCb
        // done(err)  // This will callback out of the async.each iterator and immediately the async.each callback
        // callback(err)  // This will callback out of calcBalance and continue executing
        // return callback(err); // This will callback out of calcBalance and stop executing
      } else if (rows.length != 0) {
        if (rows != 0) {
        // Your code might hang here without calling a callback
      } else {
        // Your code might hang here without calling a callback
      }
    }); // end connectionMysql
  },function(err){
    // Inside async.each callback. Either everything worked or something broke
    callback(err,userData); // Send the data back out of calcBalance
  });

  //callback(null, userData); // Running this here will IMMEDIATELY call back before async.each runs
}
票数 1
EN

Stack Overflow用户

发布于 2015-07-21 20:30:29

calcBalance函数

代码语言:javascript
复制
function calcBalance(userData,callback){
    // Ensuite on va calculer les rtt_balances et holiday_balances et yesterday_extra_hours_month
    var user_id=userData.id,
        resultCalcBalance=0,
        cats_id=[3,4,6],
        tabData={},
        dateJour=moment().format('YYYY-M-D');;

    async.each(cats_id,function(cat_id,done){
    switch (cat_id) {
        case 3:
            var comp = "<=";
            break;
        case 4:
            var comp = "<=";
            break;

        case 6:
            var comp = "<";
            break;
    }// fin du switch

        var calcul_balance = "select * from table1"            
        connectionMysql.query(calcul_balance, function (err, rows, fields,queryCb) {
            if (err) {
                queryCb(err); // This will callback whatever mySql passed in as queryCb
                // done(err)  // This will callback out of the async.each iterator and immediately the async.each callback
                // callback(err)  // This will callback out of calcBalance and continue executing
                // return callback(err); // This will callback out of calcBalance and stop executing
                console.log('Error ' + err);
                queryCb(err);
            }
            else if (rows.length != 0) {
                if (rows != 0) {
                    // On va chercher les valuers sinon on les laisse à zéro par défaut.
                    for (var j = 0; j < rows.length; j++) {
                        if (!isNaN(rows[j].amount) && rows[j].amount != null) {
                            resultCalcBalance += parseInt(Math.round(rows[j].amount * 100) / 100);
                            //console.log('ResultCalculBalance 1chiffre ' + parseInt(Math.round(rows[j].amount*100)/100) + ' 2chiffre' + resultCalcBalance);
                        } else {
                            resultCalcBalance += 0;
                            //console.log('ResultCalculBalance 2' + JSON.stringify(rows[j].amount));
                        }
                    } // fin du for k
                    //console.log('Resultat : ' + userData.id + ' ' + cat_id + ' ' + resultCalcBalance);
                    if (cat_id == 3) userData.holiday_balance = resultCalcBalance;
                    if (cat_id == 4) userData.rtt_balance = resultCalcBalance;
                    if (cat_id == 6) userData.yesterday_extra_hours_month = resultCalcBalance;
                }// fin du if
                else {
                    if (cat_id == 3) userData.holiday_balance = 0;
                    if (cat_id == 4) userData.rtt_balance = 0;
                    if (cat_id == 6) userData.yesterday_extra_hours_month = 0;
                }// fin du else
            }// de la condition err ou pas
            console.log('1 '+JSON.stringify(userData));
        });
    },function(err){
        callback(err,userData);
    });
    //callback(null, userData); // Running this here will IMMEDIATELY call back before async.each runs
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31544802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档