节点异步回调:如何在回调中返回循环内的对象?

时间:2014-07-16 16:34:57

标签: javascript node.js asynchronous callback asynccallback

我的基本问题类似于这个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之间的任何位置,则会因调用多个响应而出错。有没有办法延迟渲染命令,直到回调完成没有将它放在回调中?任何建议都非常感激。

0 个答案:

没有答案