异步控制器sails.js

时间:2015-01-07 16:20:55

标签: javascript node.js sails.js

变量obj仍然清空到console.log(obj),我怎样才能完成搜索并使用所有数据打印变量?

'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)
            });
        },

2 个答案:

答案 0 :(得分: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);
    });
},

答案 1 :(得分:0)

你的代码中的一些东西,我用一段可以帮助你解决问题的代码制作了一个jsbin(当然不用于jsbin),仔细阅读我添加的评论。

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

            });
        },