我的基本问题类似于这个previous post,除了我的回调中还有两个循环(从两个数组中获取数据并最终在浏览器中返回一个json对象数组)。这是我的代码:
router.get('/users', function(req, res) {
userColl.find().toArray(function (err, items) {
if (err) {console.log(err + ': err');} else {
var userlist = [];
items.forEach(function (dj) {
showColl.find({hostId: dj._id}).toArray(function (err, shows) {
if (err) {console.log('showFind error: ' + err);} else {
shows.forEach( function (show) {
userlist.push(
{
_id: dj._id,
access: dj.access,
firstName: dj.firstName,
lastName: dj.lastName,
gradYear: dj.gradYear,
shows: show.showTitle,
show_id: show._id
}
);
// =============== SPOT #2 =============
}); // end shows loop
}
}); // end showColl.find
}); // end items.forEach
console.log(JSON.stringify(userlist) + ' ul');
res.render('admin/users/manageUsers', {
"userlist" : userlist,
title: 'view users'
});
} // end if/else
}); // end userColl.find callback
});
我认为我所拥有的东西会起作用,并且它不会返回任何错误,但由于它是异步的,因此在呈现页面时userlist
变量为空。如果我将show命令放在show循环(SPOT#2)中,它会在第一个循环之后呈现页面,所以我有一个项目而不是我期待的那几个。如果我将渲染调用放在其当前位置和SPOT#2之间的任何位置,则会因调用多个响应而出错。有没有办法延迟渲染命令,直到回调完成没有将它放在回调中?任何建议都非常感激。