Reputation: 391
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
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
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