Node JS Async.parallel

时间:2015-11-10 09:50:27

标签: node.js asynchronous sails.js

我正在学习节点,并希望优化我所做的代码。我尝试使用Async.parallel来执行操作,完成后返回一个json。 我是js节点的新手,我正在尝试使用async.parallel,但我在其他代码中返回[Function],我正在尝试理解它

getTabletIntRout: function(req, res) {
    var reqMAC = req.param('id_tablet');

    Tablet.findOne(reqMAC).populate('rout_tablet').exec(function(err, tablet) {
      if (err) return next(err);
      if (!tablet) return next();

      var arrRoutes = tablet.rout_tablet;
      if (arrRoutes.length > 0) {
        var routesNotRemoved = [];
        arrRoutes.forEach(function(route) {
          if (route.removed == 'no') {
            Rout.findOne(route.id)
              .populate('rout_assigned') // Pin
              .populate('in_rout') // Tablet
              .populate('rout_description_assigned') 
              .exec(function(err, rout2) {
                var arrRout = rout2.rout_assigned;
                var routsNotRemoved = [];
                if (arrRout.length > 0) {
                  arrRout.forEach(function(ruta) {
                    if (ruta.removed == 'no') {
                      routsNotRemoved.push(ruta);
                    }
                  });
                }

                var arrTablets = rout2.in_rout;
                var tabletsNotRemoved = [];

                if (arrTablets.length > 0) {
                  arrTablets.forEach(function(tab) {
                    if (tab.removed == 'no') {
                      tabletsNotRemoved.push(tab);
                    }
                  });
                }

                var arrDesc = rout2.rout_description_assigned;
                var descripNotRemoved = [];

                if (arrDesc.length > 0) {
                  arrDesc.forEach(function(desc) {
                    if (desc.removed == 'no') {
                      descripNotRemoved.push(desc);
                    }
                  });
                }

                rout2.rout_assigned = routsNotRemoved;
                rout2.in_rout = tabletsNotRemoved;
                rout2.rout_description_assigned = descripNotRemoved;
                routesNotRemoved.push(rout2);
              });
            }
          });

          setTimeout(function() {
            if (routesNotRemoved.length > 0) {
              res.json({ info: routesNotRemoved });
            } else {
              return res.json({"error": "-1", "message": "Todas las rutas asociadas a esa tablet están eliminadas"});
            }
          }, 2000);
        } else {
          return res.json({"error": "-2", "message": "No existen rutas asociadas en esa tablet"});
        }


      }););});}},

1 个答案:

答案 0 :(得分:4)

我会尝试提供一些想法,希望有些想法会在您的域名中有意义。

  1. 提取功能,让人们了解您在该大功能中所做的事情
  2. 所以而不是

    Tablet.findOne(reqMAC).populate('rout_tablet').exec(function(err, tablet) { // ...
    

    你会有

    Tablet.findOne(reqMAC).populate('rout_tablet').exec(meaningfulFunctionName);
    
    1. 不要重复
    2. 所以你的代码会变短,每当代码的读者找到一个函数名时,他/她就已经知道里面发生了什么

      if (arrRout.length > 0) {
        arrRout.forEach(function(ruta) {
          if (ruta.removed == 'no') {
            routsNotRemoved.push(ruta);
          }
        });
      }
      

      无需检查空arrRout,因为arrRout.forEach的参数函数在length为零的情况下不会运行。

      您所写的只是一个过滤功能,为什么不使用filter?像这样

      arrRout.filter(function(ruta) {
        return ruta.removed == 'no';
      });
      

      如果您为arrTabletsarrDesc提取匿名函数,也可以重复使用此项。

      论证:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

      1. 请勿使用庞大的if else
      2. 要么检查反向,要么返回默认值或在您的域中有意义的内容,但是没有那么大的逻辑,这使得很难推断出您的代码。

        1. 提取更多功能,以便于使用async
        2. 你可能想要这样的东西

          async.waterfall([
            function(next) {
              // here you can put 
              // Tablet.findOne(reqMAC).populate('rout_tablet').exec
              // invoke next with err, tablet
            },
            function(tablet, next) {
              async.each(arrRoutes, function(arrRoute, nextEach) {
                // write your code logic here
              });
            }
          ], function() {
            // decide what to invoke res.json with
          });
          

          请记住在完成将逻辑放入异步步骤之后提取功能,我没有这样做,所以更清楚地放置什么。

          我希望这是有道理的,随时问你是否有任何疑问。

          下次发帖时,请确保正确缩进,不要将其粘贴到此处。