所以我有这样的代码:
Rating.find({user: b}, function(err,rating) {
var covariance=0;
var standardU=0;
var standardV=0;
while (rating.length>0){
console.log("the avarage rating u is:" + avarageRatingU)
console.log("the avarage rating v is:" + avarageRatingV)
currentMovie = rating.pop();
var u=currentMovie.value-avarageRatingU;
standardU = standardU + Math.pow(u,2);
var v=0;
Rating.find({movieid:currentMovie.movieid, user:a}, function(err,ratings) {
if (err) throw err;
if(ratings.length>0){
v=ratings.pop().value-avarageRatingV;
standardV=standardV+Math.pow(v,2);
covariance =covariance+u*v;
console.log(covariance);
}
})
}
console.log(covariance)
callback(null,covariance);
//sim = covariance/(Math.sqrt(standardU)*Math.sqrt(standardV));
})
问题是当我打印协方差时,它将打印0,因为打印发生在计算之前。我考虑过使用async.series,但是,我不能在while循环中使用回调函数。
任何建议都将不胜感激。
Ty :)
发布于 2015-10-29 04:20:19
你不能像这样在循环中调用回调函数吗?不确定这是否对你有帮助。
while (rating.length>0){
console.log("the avarage rating u is:" + avarageRatingU)
console.log("the avarage rating v is:" + avarageRatingV)
currentMovie = rating.pop();
var u=currentMovie.value-avarageRatingU;
standardU = standardU + Math.pow(u,2);
var v=0;
Rating.find({movieid:currentMovie.movieid, user:a}, function(err,ratings) {
if (err) throw err;
if(ratings.length>0){
v=ratings.pop().value-avarageRatingV;
standardV=standardV+Math.pow(v,2);
covariance =covariance+u*v;
console.log(covariance);
}
if(rating.length == 0){
console.log(covariance);
callback(null, covariance);
}
})
}
发布于 2015-10-29 04:07:16
在这种情况下,最好使用promises或异步库,而不是传统的while循环。既然您已经熟悉异步,那么就使用async.map (https://github.com/caolan/async#map)提前获取所需的所有数据。
Rating.find({user: b}, function(err,rating) {
var covariance=0;
var standardU=0;
var standardV=0;
aync.map(rating, function(currentMovie, cb) {
Rating.find({ movieid:currentMovie.movieid, user:a }, function(err,ratings) {
cb(err, ratings);
});
}, function(err, results) {
if (!err) {
// compute covariance with all movie data
}
});
})
发布于 2015-10-29 03:54:29
这样如何:
Rating.find({user: b}, function(err,rating) {
var covariance=0;
var standardU=0;
var standardV=0;
var c = rating.length; // loop counter
var r = 0; // received counter
function aux_callback (covariance) {
r++;
if (r==c)
callback(null,covariance);
}
while (rating.length>0){
console.log("the avarage rating u is:" + avarageRatingU)
console.log("the avarage rating v is:" + avarageRatingV)
currentMovie = rating.pop();
var u=currentMovie.value-avarageRatingU;
standardU = standardU + Math.pow(u,2);
var v=0;
Rating.find({movieid:currentMovie.movieid, user:a}, function(err,ratings) {
if (err) throw err;
if(ratings.length>0){
v=ratings.pop().value-avarageRatingV;
standardV=standardV+Math.pow(v,2);
covariance =covariance+u*v;
console.log(covariance);
aux_callback(covariance);
}
})
}
//sim = covariance/(Math.sqrt(standardU)*Math.sqrt(standardV));
})
您需要从循环内的lambda函数触发回调,以确保在运行该代码之前不会发生这种情况。鉴于您似乎需要完成所有循环,我创建了两个计数器,c
用于跟踪lambda必须运行的次数,r
用于计算调用aux_callback的次数。此代码应等到计算完所有协方差后再调用callback
https://stackoverflow.com/questions/33400118
复制相似问题