4

我对猫鼬很陌生,所以请多多包涵。

有没有办法在“并行”中执行两个查询。或者至少查询两个文档并一起返回它们的结果?回调符号在同步时让我有些吃惊。

在伪代码中,这就是我要寻找的:

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

    waitAll(task1, task2);

    callback(task1, task2); 
}

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

4

2 回答 2

12

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

您需要一些库来处理异步控制流,例如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
    });
};

when.js是一个处理承诺的模块。所以,如果你不需要 Promise,你可以使用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
  });
};

更新: Promises 是通过用 Promise 包装异步函数来处理异步控制流的另一种方法。

通常,要获得某个异步函数的结果,您应该向它传递一些回调,该回调将在将来的某个地方执行。

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

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

在我的示例中,我正在执行两个查询,并为其结果获得两个承诺。然后我告诉节点等到两个promise都得到满足后再将它们的结果传递给callback函数。

您可以在此处阅读promises/A+规范。您还可以查看when.jsapi 文档

于 2013-07-10T07:59:32.420 回答
4

如今,这可以通过以下方式实现Promise.all

Promise.all([
  collection1.find({foo: 'bar'}),
  collection2.find({fooey: 'bazzy'})
]).then(([fooResults, fooeyResults]) => {
  console.log('results: ', fooResults, fooeyResults);
}).catch((err) => {
  console.log('Error: ', err);
});
于 2018-03-27T09:38:17.013 回答