变量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)
});
},
答案 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
});
},