Аз работя с nodejs и sequelize framework, но имам проблеми, които се опитват да извлекат някои данни
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() {
})
}
Имам тази функция, която получава целия медикаментс неговата обща стойност в запаса. Но външното обещание завършва преди извикването. Знам, че е налице грешка за циклични обещания, но има ли по-добър начин да направите това, отколкото да фиксирате този код?
За да дам малко повече контекст, имам таблицаинвентаризация, която има чуждестранен ключ към табличните лекарства, а в инвентарната таблица има количеството на медикаментите. Искам да получа нещо като [{name1, sum (stockQuantity1)}, {name2, sum (stockQuantity2)}, ... но не мога да го направя.
Бих се радвал на всяка помощ
Отговори:
1 за отговор № 1Трябва да обгърнете всичко в подобно обещание
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 */ });
Като настрана изглежда, че правите много логика за нещо, което най-вероятно може да се направи с a join
запитване. IIRC последователно призовава това include
на обекта на заявката ви.