【发布时间】:2015-07-08 18:14:37
【问题描述】:
我有 var movieRecommendation,它是根据来自 Mongo DB 的数据填充的。问题是 Mongoose Movie.findOne() 调用是 asycn 调用,它不允许我获得最终填充的 movieRecommendation,我需要将其作为响应发回。
exports.getRecommendation=function(req,res){
var movieRecommendation = [];
var id=req.params.id;
console.log('----- Get User Recommendation - ' + id);
var url = 'http://52.8.48.113:8080/recommender-server/recommender/v1/recommendations/'+id+'.do';
//make http get request
request({
url: url,
json: true
}, function (error, response, recommendations) {
// res.json(recommendations);
if (!error && response.statusCode === 200) {
recommendations.forEach(function(entry) {
**Movie.findOne({'id':parseInt(entry.itemId)},function(err, movieData){**
entry.movie = movieData;
movieRecommendation.push(entry);
//console.log('rec', movieRecommendation);
console.log(movieRecommendation.length);
});
});
}
console.log("====Final========"+movieRecommendation.length);
//Output = 0
});
res.json(movieRecommendation); // Here movieRecommendation is coming as black Array
};
请告诉我如何才能最终填充 movieRecommendation var 以使其可用于响应。
【问题讨论】:
-
永远不要使用常规的
for循环来执行异步调用,因为它们不会等待您的异步调用返回。尝试async.each或实现承诺的模块,如q(npmjs.com/package/q) 或bluebird(npmjs.com/package/async#each)。