2017-11-08 21 views
0

Sequelizeでクエリを作成していて、dbの各ユーザーに基づいてクエリを実行したいとします。私は約束にこのforeachループをオンにする方法がわからないので、foreachループが終了した後、私が操作を行うことができます....非同期操作のループ

users.forEach(user => { 
    let userHideCount = 0 
    Comment_List.findAll({ 
    where: {user_id:user}, attributes: ['user_id','cid'], include: [ 
     {model: Comment, attributes: ['verb','created_time']} 
    ], 
    order: [[ Comment, 'created_time', 'DESC' ]], 
    }) 
    .then(cl => { 
    cl.forEach(comment => comment.get({plain:true}).comments[0].verb === 'hide' ? userHideCount++ : null) 
    hiddenCounts[user] = userHideCount 
    }) 
}) 

それとも、これについて移動する良い方法はあり...どんな助けも大いに評価されています!

答えて

1

Promise.allを使用し、forEachを約束を返すmapに変換します。例:

var userPromises = users.map(user => { 
    let userHideCount = 0 
    return Comment_List.findAll({ 
    where: {user_id:user}, attributes: ['user_id','cid'], include: [ 
     {model: Comment, attributes: ['verb','created_time']} 
    ], 
    order: [[ Comment, 'created_time', 'DESC' ]], 
    }) 
    .then(cl => { 
    cl.forEach(comment => comment.get({plain:true}).comments[0].verb === 'hide' ? userHideCount++ : null) 
    hiddenCounts[user] = userHideCount 
    }) 
}) 

// Then, sometime later: 
Promise.all(userPromises).then(() => { 
    // Do stuff. 
})