/ / Loop за получаване на асинхронни данни в nodejs sequelize - javascript, node.js, promise, sequelize.js

Loop за получаване на асинхронни данни в nodejs sequelize - javascript, node.js, обещание, sequelize.js

Аз работя с 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 на обекта на заявката ви.