如何在NodeJS中同步MongoDB异步查询

时间:2014-02-25 18:35:14

标签: node.js mongodb promise q

我有一个for循环语句和一个异步MongoDB内部循环体。我想要做的是从我的MongoDB数据库中进行find查询,并将结果推送到数组中。

以下是代码:

function() arrResult() {
  var arr = [];
  for(...) {
    collection.find({ foo: i }, function (err, cursor) {
      arr.push(cursor);   
    }    
  }
  return arr;
}

但很明显,函数的返回值是一个空数组。

我想使用Q模块解决此问题。有没有解决方案?

2 个答案:

答案 0 :(得分:2)

  

我想使用Q模块解决这个问题。有没有解决方案?

是的,承诺是一个非常容易的抽象来处理这个问题。您可以并行执行查询,并使用all收集结果。

特别是Q,它看起来像这样:

function arrResult(…) {
    var promises = [];
    for (…)
        promises.push( Q.ninvoke(collection, "find", {foo: i}) );
    return Q.all(promises);
}

arrResult(…).then(function(arr) {
    …
}, function(err) {
    // first error, if any occured
});

答案 1 :(得分:1)

您需要一个像进程门一样的同步机制。 每个返回的查询必须到达门,例如减少一些计数器并存入其结果。 当所有人都到达大门时,最后的回调确实会返回收集的结果。