要在Mongoose中进行并行"查询"

Sla*_*ppy 4 mongoose mongodb node.js

我对Mongoose很新,所以请耐心等待.

有没有办法在"并行"中执行两个查询.或者至少查询两个文档并将结果一起返回?回调表示法让我在同步时绊倒了一点.

在伪代码中这是我正在寻找的:

function someWork(callback) {   
    var task1 = service.doQueryAndReturnTask();   
    var task2 = service.doQueryAndReturnTask();

    waitAll(task1, task2);

    callback(task1, task2); 
}
Run Code Online (Sandbox Code Playgroud)

我知道这不是解决方案,因为需要在doQueryAndReturnTask上进行回调,但我需要一个有效且可引用的模式并不链接回调

Leo*_*tny 12

这不是关于猫鼬.Node.js是一种异步语言,因此它允许您同时执行任意数量的异步任务(例如,查询数据库).

你需要的是一些lib来处理异步控制流,比如async.jswhen.js:

var when = require('when');

var someWork = function(callback) {
  when.all([
    collection1.find(query1).exec(),
    collection2.find(query2).exec()
  ]).spread(callback)
    .otherwise(function(err) {
      // something went wrong
    });
};
Run Code Online (Sandbox Code Playgroud)

when.js是一个处理承诺的模块.所以,如果你不需要承诺,你可以async.js改用:

var async = require('async');

var someWork = function(callback) {
  async.parallel([
    function(cb) { collection1.find(query1, cb) },
    function(cb) { collection2.find(query2, cb) }
  ], function(err, res) {
    if (!err) return callback.apply(null, data);
    // something went wrong
  });
};
Run Code Online (Sandbox Code Playgroud)

更新: Promises是通过使用promises包装异步函数来处理异步控制流的替代方法.

通常,为了获得某些异步函数的结果,你应该传递一些回调,这将在将来的某个地方执行.

当你使用promises,而不是传递一些回调时,你会立即得到执行结果的承诺,这些结果将在未来的某个地方得到解决.

因此,promises允许您使用promises而不是真实数据以同步方式使用异步函数.Promises还允许您在执行的任何时候等待结果.

在我的例子中,我正在执行两个查询,为他们的结果获得两个承诺.然后我告诉节点等待,直到两个承诺都完成后,将结果传递给callback函数.

你可以promises/A+在这里阅读规范.您也可以查看when.jsapi文档.