Danieledu
Danieledu

Reputation: 391

asynchronous controllers sails.js

the variable obj still empties into the console.log ( obj) , how do I get finished ahcer Search and print the variable with all the data ?

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

Upvotes: 2

Views: 1731

Answers (2)

zieglar
zieglar

Reputation: 830

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

Upvotes: 1

MrVinz
MrVinz

Reputation: 874

Several things in your code, i made a jsbin (of course not working on jsbin) with a piece of code that may help you solve your problems, carefully read the comments i've added.

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

I make several intermediate outputs, if this doesn't solve your issue please console log the outputs of the modified code adapted to yours.

Here is a copy of the code for those wo don't want to visit 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

            });
        },

Upvotes: 0

Related Questions