【问题标题】:asynchronous controllers sails.js异步控制器sails.js
【发布时间】:2015-01-07 16:20:54
【问题描述】:

变量 obj 仍然清空到 console.log (obj) 中,我如何完成 ahcer 搜索并打印包含所有数据的变量?

'showservices': function (req, res, next) {
            Service.find(...., function (err, services) {
                if (err) return next(err);
                var obj = [];
                _.each(services, function(s){
                    SaleDetail.find({id_service:s.id_service}, function (err, details){

                        var total = 0
                        var cont = 0
                        _.each(details, function(d){

                            total = total + parseFloat(d.fullPrice);
                            cont ++;

                        });
                        obj.push({
                            name: s.serviceName,
                            cant: cont,
                            total: total,

                        });
                         console.log(obj)
                    });

                }); 

                 console.log(obj)
            });
        },

【问题讨论】:

    标签: javascript node.js sails.js


    【解决方案1】:

    请使用async

    'showservices': function (req, res, next) {
        async.auto({
            services: function(callback){
                Service.find(....).exec(callback);
            },
            result: ['services', function(callback,results){
                var obj = [];
                async.each(results.services, function(s, innercb){
                    SaleDetail.find({id_service:s.id_service}).exec(function(err, details){
                        var total = 0
                        var cont = 0
                        _.each(details, function(d){
                            total = total + parseFloat(d.fullPrice);
                            cont ++;
                        });
                        obj.push({
                            name: s.serviceName,
                            cant: cont,
                            total: total,
                        });
                        innercb();
                    });
                }, function(err){
                    callback(err, obj);
                });
            }],
        }, function(err,result){
            if (err) return next(err);
            console.log(result.result);
        });
    },
    

    【讨论】:

      【解决方案2】:

      您的代码中有几处,我用一段代码制作了一个 jsbin(当然不是在 jsbin 上工作),可以帮助您解决问题,请仔细阅读我添加的 cmets。

      http://jsbin.com/howanojoka/1/edit?js

      我做了几个中间输出,如果这不能解决您的问题,请控制台记录适合您的修改代码的输出。

      这里是那些不想访问 jsbin 的人的代码副本:

      'showservices': function (req, res, next) {
                  Service.find('', function (err, services) {
                      if (err) return next(err);
                     //we are in sails so lets log properly
                     sails.log.info(services.length); //if 0 your problem may be here...
                     var serLen=services.length ; //storing the value of length for checking completin (faster than calling each time services.length ;)
                     var obj = [];
                     var completeService=0;
                      _.each(services, function(s){
                          SaleDetail.find({id_service:s.id_service}, function (err, details){
                              //are you sure you have no error here .... 
                              if(err) return next(err); //why not here ? 
                              //again are you sure you have a result
                              sails.log.info(details.length);//if 0 your problem may be here as well
                              var total = 0
                              var cont = 0
                              _.each(details, function(d){
                                  total = total + parseFloat(d.fullPrice); //you could write total+=parseFLoat(d.fullPrice); just an info :)
                                  cont ++;
                              });
                              obj.push({
                                  name: s.serviceName,
                                  cant: cont,
                                  total: total,
      
                              });
                              sails.log.info(obj)//let's use sails log again :) 
                              completeService++;
                              if(completeService===serLen){
                                sails.log.info(obj)//here is your completed object
                                return next();
                              }
                          });
      
                      }); 
                      //your global problem i assume is when to "return" as you have async ? so i gave a try look abovee:)
                      sails.log.info(obj)//this will be executed before any or some SaleDetail.find() as as your SaleDetail.find is async, in clear empty array
      
                  });
              },
      

      【讨论】:

        猜你喜欢
        • 2015-07-05
        • 1970-01-01
        • 2017-11-20
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        • 2017-09-18
        • 2014-07-04
        相关资源
        最近更新 更多