javascript - 在内部 forEach 循环中集成异步 mongo 调用

标签 javascript node.js asynchronous

我有两个循环,外部循环针对用户,内部循环针对每个用户的venueID。在内部循环中,我想查找 field 并将其附加到外部外观中定义的数组 (userItem)。然而,由于 forEach 是同步的,而 mongo 数据库查找是异步的,因此结果始终保持为空。我尝试集成 this answer但无济于事。如何做到这一点?

ret = [];
users.forEach(function(user) {
    var userItem = user.getSanitised('ADM');

    userItem.venues = [];

    var tmp = [];

    userItem.adminVenueIds.forEach(function(adminVenueId){
        tmp.push(function(callback) {

            Venue.findOne({_id:adminVenueId}, function(error, venue) {

                callback(null, venue.toObject());
            });
        });

    });

    async.parallel(userItem.venues, function(err, result) {
        /* this code will run after all calls finished the job or
         when any of the calls passes an error */
        if (err)
            return console.log(err);

        userItem.venues.push(result);
    });
    ret.push(userItem);
});

也尝试了以下方法,但也不起作用

users.forEach(function(user) {

    var userItem = [];
    async.series({

            setUserItem : function(callback)
            {
                userItem = user.getSanitised('ADM');
                callback(null, 'OK');
            },
            setUserVenues : function(callback)
            {
                userItem.venues = [];
                user.adminVenueIds.forEach(function(adminVenueId,index) {

                    Venue.findOne({_id:adminVenueId}, function(error, venue) {

                        userItem.venues.push(venue.toObject());

                        if((index+1) == user.adminVenueIds.length)
                            callback(null, 'OK');

                    });
                });
            }

        },
        function(error, results) {

            if(error)
                winston.error(error);

            ret.push(userItem);

        }

    );


});

最佳答案

您可以简单地放置一个 if 语句(在您的情况下将条件作为数组长度),然后当循环完成时,您可以通过调用函数来继续执行它的操作(或者将您的代码放在那里) ,但它会开始看起来很乱)

var ret = [];
var test = [];


for (var i = 0; i < 20; i++) {
    for (var x = 0; x < 20; x++) {
         setTimeout(function() {
            test.push("Test"+x);
            if (x === 20) {
                finishIt();
            }
        }, 300)
    }
}


function finishIt() {
    console.log(test);
    ret.push(test);
}

关于javascript - 在内部 forEach 循环中集成异步 mongo 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30633672/

相关文章:

javascript - 使用 Serialize() 抛出空值传递表单数据

javascript - 想要将输入字段绑定(bind)到 jquery-ui slider 句柄

javascript - 引用错误: hash is not defined in node. js

javascript - 如果Javascript是单线程的,那么时钟如何工作?

java - Project Reactor 是 java 的 CompletableFuture 的包装器吗?

Python 3 : How to submit an async function to a threadPool?

javascript - 如何在谷歌地图标记中添加点击事件?

javascript - 滚动到时更改元素类别

javascript - 渲染页面时如何从 Handlebars 获取 Angular 数据

node.js - 无法使用 mongoose 在 mongodb 中持久化对象数组