同期のforeachと2クエリ結果をレンダリングNODEJS

Bilel Mosbah:

私はNodeJSの始め方だと私は現在、より多くの、その後二日間、この問題でブロックされています!誰かが助けることができる場合、私は非常にthankfullになります!

私は、すべての結果をマッピングし、両方のクエリ結果をレンダリングし、別の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});   

各ループのための終わりまで待つ!!!!

クシシュトフ・Krzeszewski:

まず第一に私が使用してお勧めしたいArray.prototype.mapの上にArray.prototype.forEachあなたがコールバック関数から値を返すようにしたい場合。第二に、あなたがあなた自身の作成することができますPromise終了する瞬間の関数呼び出しを解決することを/ req.session.sharings書かれています。私はちょうどそれらを一緒にグループ化し、上にそれらをプッシュに決めたので、あなたは本当に、手動で書き込みsharringsに必要な場合、私はわからなかった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});
        });
    });
});

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=30961&siteId=1