我如何将Q promise与MongoDB cursor.each()一起使用?

我的代码的要点如下:

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

您在each()中传递的函数将被asynchronous执行。 您需要立即返回一个承诺,并在所有迭代完成后解决它:

 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) {});