Как ждать результатов MongoDB в нескольких вложенных циклах - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь загрузить определенную страницу с моего сайта только после загрузки данных из базы данных. Однако он выводит результаты слишком рано, давая пустой массив, и не группирует имена вообще. Я полагаю, что это может быть решено с помощью asyn c и ожидания функций или обратных вызовов, но я новичок в этом и, несмотря на то, что я искал, я все еще не могу найти решение. До сих пор я просто возился с упаковкой определенных циклов или функций в функции asyn c и ожидал их. Другие решения были сосредоточены на одном .find () или другом l oop. Любая помощь приветствуется! Спасибо!

Маршруты. 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("/");
});

getGroups:

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;
};

1 Ответ

0 голосов
/ 22 апреля 2020

В вашем первом фрагменте кода вы должны установить

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", asyn c (req, res) => {var result = [];

result = await users.findById(mongo.ObjectID("IDString"));

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

res.redirect("/");

});

Во втором фрагменте кода, Вы должны использовать ожидание или обратный вызов. Как описано выше.

...