如何与MongoDB cursor.each()一起使用Q promises?

时间:2015-05-22 02:44:03

标签: node.js mongodb promise q

我的代码的要点如下:

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

}

1 个答案:

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