【问题标题】:How to wait for MongoDB results in multiple nested loops如何等待 MongoDB 导致多个嵌套循环
【发布时间】:2020-04-22 14:15:17
【问题描述】:

仅在从数据库加载数据后,我才尝试从我的网站加载某个页面。但是,它过早地打印结果,给出一个空数组,并且根本没有对名称进行分组。我相信这可以通过 async 和 await 函数或回调来解决,但我是新手,尽管我已经搜索过,但我仍然找不到解决方案。到目前为止,我一直在搞乱在异步函数中包装某些循环或函数并等待它们。其他解决方案专注于一个 .find() 或其他循环。任何帮助表示赞赏!谢谢!

Routes.js:

app.get("/test", async (req, res) => {
    var result = [];

    users.findById(mongo.ObjectID("IDString"), async (err, res) => {
        result = await res.getGroups(users, messages);
    });

    console.log(result);
    //this should print [["name1"]["name1", "name2"],["name3", "name1"]]

    res.redirect("/");
});

获取组:

UserSchema.methods.getGroups = async function(users, messages) {
    var result = [];
    await messages.find({Group: this._id}, (err, group) => {
        for(var i = 0; i < group.length; i++){
            var members = group[i].Group;
            var subArray = [];

            members.forEach((memberID) => {
                users.findById(memberID, (err, req) => {
                    console.log(req.name);
                    subArray.push(req.name);
                    console.log(subArray);
                });
            });

            //After function finishes:
            console.log(subArray);
            result.push(subArray);
            subArray = [];
        }
    });
    return result;
};

【问题讨论】:

    标签: javascript node.js mongodb asynchronous async-await


    【解决方案1】:

    在你的第一个代码sn-p中,你必须设置

    console.log(result);
        //this should print [["name1"]["name1", "name2"],["name3", "name1"]]
    
    res.redirect("/");
    

    findById的回调函数中。像这样:

    app.get("/test", async (req, res) => {
        var result = [];
    
        users.findById(mongo.ObjectID("IDString"), async (err, res) => {
            result = await res.getGroups(users, messages);
    
            console.log(result);
            //this should print [["name1"]["name1", "name2"],["name3", "name1"]]
    
            res.redirect("/");
        });
    });
    

    这是因为 Javascript 的异步特性。阅读下面的文章

    https://medium.com/better-programming/is-javascript-synchronous-or-asynchronous-what-the-hell-is-a-promise-7aa9dd8f3bfb

    如果你想使用 async/await 范式,你可以这样写代码:

    app.get("/test", async (req, res) => { 变量结果 = [];

    result = await users.findById(mongo.ObjectID("IDString"));
    
    console.log(result);
    //this should print [["name1"]["name1", "name2"],["name3", "name1"]]
    
    res.redirect("/");
    

    });

    在您的第二个代码 sn-p 中,您应该使用 await OR 回调。就像上面解释的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 2021-08-09
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多