【问题标题】:How can I use Q promises together with MongoDB cursor.each()?如何将 Q Promise 与 MongoDB cursor.each() 一起使用?
【发布时间】:2015-08-03 22:30:10
【问题描述】:

我的代码要点如下:

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

}

【问题讨论】:

    标签: node.js mongodb promise q


    【解决方案1】:

    您传入的函数each() 将异步执行。您需要在所有迭代完成后立即返回一个 Promise 并解决它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2012-09-16
      • 2013-06-30
      • 1970-01-01
      • 2019-05-06
      相关资源
      最近更新 更多