/ / Boucle pour obtenir des données asynchrones dans nodejs sequelize - javascript, node.js, promise, sequelize.js

Boucle pour obtenir des données asynchrones dans nodejs sequelize - javascript, node.js, promise, sequelize.js

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 № 1

Vous 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.