【问题标题】:How to synchronize MongoDB async query in NodeJS如何在 NodeJS 中同步 MongoDB 异步查询
【发布时间】:2014-03-28 04:54:12
【问题描述】:

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

代码如下:

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

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

我想使用Q 模块来解决这个问题。有什么解决办法吗?

【问题讨论】:

    标签: node.js mongodb promise q


    【解决方案1】:

    我想用 Q 模块解决这个问题。有什么解决办法吗?

    是的,promise 是一个非常容易处理这个问题的抽象。您可以并行执行查询,并使用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
    });
    

    【讨论】:

    • 太棒了。你能用Q.defer()完成吗?
    • @AfshinMehrabani:我为什么需要这样做?一个never uses Q.defer 手动。 Q.ninvoke 和另一个 callback-function method 完全避免这种情况。
    • 仅用于教育目的。
    • 我认为Using deferreds in the Q docs 已经很好地涵盖了这一点。您可以将FS.readFile 的示例直接翻译成collection.find 的示例
    【解决方案2】:

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

    【讨论】:

    • 有趣...你有这方面的例子吗?我很感兴趣
    • 我手工编写了这样的代码,但它必须存在于 Node.js 生态系统中。给我一点时间。
    • @mvw: 你在找async.js' parallel function... 但是请注意,OP 想要使用 Q。
    • @Bergi:是的。我不知道的q解决方案。
    猜你喜欢
    • 2016-12-14
    • 2018-01-15
    • 1970-01-01
    • 2023-03-28
    • 2020-11-03
    • 2021-03-21
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多