ドキュメントごとに同期アクションを実行するだけでよい場合、ソリューションは非常に簡単です。(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 } });
});
});
});
難読化をご容赦ください (アンダーラップされているプロジェクトのソースから直接ヤンクしました)。基本的に、最後の非同期操作が完了するまで待ちます。