2017-10-10 63 views
0

我目前使用Node.js與Sequelize(MySQL),並有兩個模型,它們之間有一個關聯:M.belongsTo(C)。我想要做的是查詢所有C並將所有屬於C的M添加到返回的JSON對象中。請參見下面的代碼,代表我的最新嘗試:等待與sequ​​elize查詢

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 promise成功解析後解析這些promise。

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

Thanks!我的錯誤是我試圖以錯誤的方式使用Promise.all()。 – Minoru