我对Mongoose很新,所以请耐心等待。
有没有办法在“并行”中执行两个查询。或者至少查询两个文档并将结果一起返回?回调表示法让我在同步时稍微绊倒了。
在伪代码中,这就是我要找的东西:
function someWork(callback) {
var task1 = service.doQueryAndReturnTask();
var task2 = service.doQueryAndReturnTask();
waitAll(task1, task2);
callback(task1, task2);
}
我知道这不是解决方案,因为需要在doQueryAndReturnTask上进行回调,但我需要一个有效且可引用的模式并不链接回调
答案 0 :(得分:12)
这不是关于猫鼬。 Node.js是一种异步语言,因此它允许您同时执行任意数量的异步任务(例如,查询数据库)。
您需要的是一些用于处理异步控制流的lib,例如async.js或when.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
是处理承诺的模块。因此,如果您不需要承诺,则可以改为使用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
});
};
更新: Promise是通过使用promises包装异步函数来处理异步控制流的替代方法。
通常,为了获得某些异步函数的结果,你应该传递一些将在未来某处执行的回调。
当你使用promises,而不是传递一些回调时,你会立即得到执行结果的承诺,这些结果将在未来的某个地方得到解决。
因此,promises允许您使用promises而不是真实数据以同步方式使用异步函数。 Promises还允许您在执行的任何时候等待结果。
在我的例子中,我正在执行两个查询,获得两个结果的承诺。然后我告诉节点要等到两个承诺都完成后再将结果传递给callback
函数。
您可以阅读promises/A+
specification here。您也可以查看when.js
api docs。
答案 1 :(得分:1)
如今,可以使用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);
});