Если вам нужно выполнять синхронные действия только для каждого документа, решение довольно простое. (console.warn () является синхронным, поэтому вы можете использовать его для проверки того, что все пользовательские объекты обрабатываются первыми.)
User.find({}).execFind(function(err, users) {
users.forEach(function(user) {
user.age += 1;
userArray.push(user);
console.warn('x');
});
// then...
console.warn('y');
});
Если вам нужно выполнить какое-то асинхронное действие (возможно, другой запрос БД), решение становится более сложным. Я недавно столкнулся с этой проблемой и кратко обсудил ее с помощью такого модуля, как Step, или развертывание своего собственного базового решения. Step предоставил больше функциональности, чем мне было нужно, поэтому я решил, что дополнительные накладные расходы не стоят того. Вот мое решение:
var count = 0;
A.find({ b : c }, ['d', 'e', 'f']).sort(['d'], -1).execFind(function(err, g) {
g.forEach(function(h) {
h.a = [];
B.find({ b : c }, ['d', 'e', 'f', 'g']).execFind(function(err, z) {
g.v = z;
if (++count == g.length)
res.render('z.jade', { locals : { title : 'Q', j : g } });
});
});
});
Прошу прощения за запутывание (я вырвал это прямо из источника проекта, который скрыт). По сути, вы ждете завершения последней асинхронной операции.