синхронизировать foreach и отображать 2 результата запроса NODEJS - PullRequest
1 голос
/ 06 марта 2020

Я начинаю с NodeJS, и я заблокирован этой проблемой более двух дней! если кто-то может помочь, я буду очень благодарен!

Я пытаюсь получить результат запроса, затем сопоставить все результаты и применить другой uery, а затем отобразить оба результата запроса. вот мой код:

app.get('/home/', function(req, res) { 
let sessionUser = req.session.user;
if(sessionUser) {
    user.findMemosByUserId(sessionUser.id, function(result) {
        result.forEach(function(memo){
            //get users having acces to each memo
            user.findUsersByMemoId(memo.id, function(result2){
                var obj = {};
                obj[memo.id] = [];
                result2.forEach(function(res){
                    obj[memo.id].push(res.username);
                });
                req.session.sharings.push(obj);
                console.log(req.session.sharings); //it shows this
            });
        });
        console.log(req.session.sharings); //it shows this first
        res.render('home.ejs', {memos: result, sharingsData: req.session.sharings});
    });

    return;
}
res.redirect('/');})

тогда проблема в том, что он рендерит страницу перед циклом и получает каждую заметку пользователям (пока req.session.sharings еще пуст)

результат входа в систему :

[ ]    
[{ },{ }] // with my data 

Кто-нибудь знает, как я могу заставить:

 res.render('home.ejs', {memos: result, sharingsData: req.session.sharings});   

ждать до конца каждого l oop !!!!

1 Ответ

0 голосов
/ 06 марта 2020

Прежде всего, я бы рекомендовал использовать Array.prototype.map вместо Array.prototype.forEach, если вы хотите вернуть значение из функции обратного вызова. Во-вторых, вы можете создать свой собственный Promise, который будет разрешать момент завершения вызова функции / req.session.sharings. Я не был уверен, нужно ли вам писать шарики вручную, поэтому я решил просто сгруппировать их и поместить в массив session.sharings только после того, как все они будут собраны.

app.get('/home/', (req, res) => {
    let sessionUser = req.session.user;
    if (!sessionUser) return res.redirect('/');

    user.findMemosByUserId(sessionUser.id, result => {
        Promise.all(result.map(memo => {
            return new Promise(resolve => {
                user.findUsersByMemoId(memo.id, result2 => {
                    const obj = {[memo.id]: result2.map(res => res.username)};
                    resolve(obj)
                });
            });
        })).then(sharings => {
            req.session.sharings.push(...sharings);
            console.log(req.session.sharings);
            res.render('home.ejs', {memos: result, sharingsData: req.session.sharings});
        });
    });
});
...