2017-10-10 2 views
0

私は現在、Sequelize(MySQL)でNode.jsを使用しており、それらの間に関連性を持つ2つのモデル、M.belongsTo(C)を持っています。私がしようとしているのは、すべてのCを照会し、Cに属するすべてのMを返されたJSONオブジェクトに追加することです。続行のクエリを待つ

C.findAll({ 
    where: { 
     parent_ids: ids 
    } 
}).then(cs => { 
    let fCs = []; 
    for (let j = 0; j < cs.length; j++) { 
     let c = cs[j].get({ plain: true }); 

     M.findAll({ 
      where: { 
       CId: c._id 
      } 
     }).then(ms => { 
      let cMs = []; 
      for (let k = 0; k < ms.length; k++) { 
       cMs.push(ms[k].get({ plain: true })); 
      } 

      c.ms = cMs; 
     }); 

     fCs.push(c); 
    } 

    return res.json({ 
     success: true, 
     cs: fCs 
    }); 
}).catch(error => { 
    return res.json({ 
     success: false 
    }); 
}); 

問題がMモデルの内側のクエリは非同期問い合わせが行われると、私は任意のクエリが実行される前に応答を得ることである:それは私の最新の試みを表して下のコードを参照してください。私もPromise.all()を使ってみましたが、外側のCクエリで繰り返しているので正しく動作させることができませんでした。

どうすれば正常に動作させることができますか?

答えて

1

dbクエリは非同期アクションであるため、クエリは実行されずにループが完了します。このため、すべてのfindAll呼び出しを配列にプッシュしないようにして、Promise.all(arrayOfPromises)はすべてのfindAll約束が正常に解決されたときにこれらの約束を解決します。

var fCs = [], cs, 
C.findAll({ 
    where: { 
    parent_ids: ids 
    } 
}).then(data => { 
    cs = data; 
    var promises = []; 
    for (let j = 0; j < cs.length; j++) { 
    let c = cs[j].get({ plain: true }); 

    promises.push(M.findAll({ 
     where: { 
      CId: c._id 
     } 
    }).then(ms => { 
     let cMs = []; 
     for (let k = 0; k < ms.length; k++) { 
      cMs.push(ms[k].get({ plain: true })); 
     } 

     return cMs; 
    })); 
    } 
    return Promise.all(promises) 
}).then(result => { 
    fcs = cs.map((el, index) => { 
    let obj = el.get({plain: true}) 
    obj.ms = result[index] 
    return obj 
    }) 
    return res.json({ 
    success: true, 
    cs: fCs 
    }); 
}).catch(error => { 
    return res.json({ 
    success: false 
    }); 
}); 
+0

ありがとうございました!私の間違いは、 'Promise.all()'を間違った方法で使用しようとしていたことでした。 – Minoru

関連する問題