Речь идет не о Mongoose. 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
});
};
Update: Обещания альтернативный способ обработки асинхронного потока управления, обернув асинхронные функции с обещаниями.
Обычно, чтобы получить результаты некоторой асинхронной функции, вы должны передать ей обратный вызов, который будет выполняться где-то в будущем.
Когда вы используете обещания, вместо того, чтобы передавать некоторый обратный вызов, вы сразу получаете обещание результатов казней, которые будут разрешены где-то в будущем.
Итак, обещания позволяют работать синхронно с асинхронными функциями, используя обещания вместо реальных данных. Обещания также позволяют дождаться результатов в любой момент выполнения.
В моем примере я выполняю два запроса, получая два обещания для их результатов. Затем я предлагаю узлу подождать, пока обе обещания не будут выполнены, передав их результаты в функцию callback
.
Вы можете прочитать promises/A+
specification here. Вы также можете посмотреть when.js
api docs.
Можете ли вы объяснить или дать ссылку на то, что такое обещание? – Slappy
@Slappy Я отредактировал свой ответ и добавил объяснение обещаний. –