asynchronous控制器sails.js

variablesobj仍然清空到console.log(OBJ),我如何完成ahcersearch和打印所有数据的variables?

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

请使用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); }); }, 

在你的代码中有几件事,我做了一个jsbin(当然不是在jsbin上工作),有一段代码可以帮助你解决你的问题,仔细阅读我添加的评论。

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

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

下面是那些我不想访问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 }); },