我的代码的要点如下:
function checkWinRate(array){
var winCount = 0;
var totalCount = 0;
db.collection.find(query).each( function(foo){
if (condition){
winCount++;
}
totalCount++;
db.close();
});
return winCount/totalCount;
}
这里显而易见的问题是,在return语句中,winCount和totalCount都仍然等于0.我正在尝试使用Q promise库来排序一系列事件,但我不确定如何实现它。谁能告诉我怎么处理Q?
修改
ID:10T错误。我忘了我正在使用和尚包装。对于那些想要知道我做了什么来解决这个问题的人,和尚有一种很好的方式来处理承诺:
function checkWinRate(array){
var winCount = 0;
var totalCount = 0;
var promise = db.collection.find(query).each( function(foo){
if (condition){
winCount++;
}
totalCount++;
db.close();
});
promise.success(function(){
return winCount/totalCount);
}
}
答案 0 :(得分:3)
您在each()
中传递的函数将异步执行。所有迭代完成后,您需要立即返回一个承诺并解决它:
var deferred = Q.defer();
db.collection.find(query).each(function(err, item) {
if (err) {
deferred.reject(err);
}
if (condition){
winCount++;
}
totalCount++;
if(item == null) {
// iterations are finished
deferred.resolve(winCount/totalCount);
db.close();
}
});
return deferred.promise;
要获得价值,您需要以这种方式致电checkWinRate
:
checkWinRate(array).then(function (rate) {});