Je travaille avec nodejs et le framework sequelize, mais j’ai des problèmes pour récupérer des données.
getAllMedicamentsWithTotal: function () {
return medicamentService.getAll().then(function success(medicaments) {
for(var i = 0 ; i < medicaments.length; i++){
getTotalMedicament(medicaments[i]).then(function (total) {
medicaments[i].dataValues.total = total;
})
}
}, function fail() {
})
}
J'ai cette fonction qui reçoit tout le médicamentavec son total dans le stock. Mais la promesse extérieure prend fin avant le rappel, elle est exécutée. Je sais qu'il y a une erreur sur les promesses en boucle, mais existe-t-il un meilleur moyen de le faire que de réparer ce code?
Pour donner un peu plus de contexte, j'ai un tableauinventaire qui a une clé étrangère à la table des médicaments, et dans la table d’inventaire se trouve la quantité de médicaments. Je souhaite obtenir quelque chose comme [{nom1, somme (stockQuantity1)}, {nom2, somme (stockQuantity2)}, ...], mais je ne parviens pas à le faire.
J'apprécierais toute aide
Réponses:
1 pour la réponse № 1Vous devez tout emballer dans une telle promesse
getAllMedicamentsWithTotal: function () {
return new Promise((resolve, reject) => {
// call your service first
medicamentService
.getAll()
// with your array of results we need to map out an array of promises
// then feed that array into Promise.all()
.then(medicaments => Promise.all(medicaments.map(med => {
return getTotalMedicament(med);
}))
// the result of Promise.all() is an array of results
// reduce the totals to get your accumulated total and resolve it to the caller
.then(arrayWithTotals => {
let total = arrayWithTotals.reduce((acc, obj) => acc += obj.dataValues.total, 0);
resolve(total);
});
});
// elsewhere...
getAllMedicamentsWithTotal().then(total => { /** your total */ });
En passant, on dirait que vous faites beaucoup de logique pour quelque chose qui peut probablement être fait avec un join
question. Suite IIRC appelle cela la include
propriété sur votre objet de requête.