Я прочитал МНОЖЕСТВО статей, но я совершенно новичок во всей этой асинхронной работе, и мне очень трудно обдумать, как все это работает. Я хочу отобразить отфильтрованный массив объектов, и внутри него я бы хотел вернуть результат функции (количество) и установить его в качестве значения pmtdue. Я пробовал это несколькими способами, но всегда получаю обещание зоны или наблюдаемое, когда оно регистрируется, или кучу ошибок. Это, вероятно, самое близкое, что я получил, но это все еще не правильно.
async today(day = null, status = null) {
this.logger.log(`show today's ${status} appts ${day}`);
// filter master list for today
const filtered = [...this.apptList].filter(appt => {
if (!status) {
return (
appt.scheduled >= this.helperService.dayStart(day) &&
appt.scheduled <= this.helperService.dayEnd(day) &&
appt.status.status !== 'Checked Out' &&
appt.status.status !== 'Scheduled'
);
} else {
return (
appt.scheduled >= this.helperService.dayStart(day) &&
appt.scheduled <= this.helperService.dayEnd(day) &&
appt.status.status === status
);
}
});
// calculate due amount and map it to pmtdue field
const dueappts = await this.getTotalDue(filtered).then(
res => {
// console.log(res);
this.ApptModels = res;
},
err => {
console.log(err);
}
);
// send the data to ng2-smart-table
console.log(`filtered ApptModels`, this.ApptModels);
}
Это функция, которая выполняет сопоставление и имеет функции, которые я хочу работать // a.pmtduedate возвращает правильное значениетак как нет http-вызова // a.pmtdue возвращает zoneawarepromise, но я не знаю, как получить ЗНАЧЕНИЕ
getTotalDue(appts: Array<any>): Promise<any> {
return Promise.all(
appts.map(async (a: any) => {
a.pmtduedate = await this.helperService.getDueDate(a);
a.pmtdue = await this.dataService.sendTotalDue(a);
console.log(a.pmtdue); // logs undefined
return a;
})
);
}
Моя функция обслуживания данных (я знаю, что иногда код имеет значение, которое я считаю незначительным):
async sendTotalDue(appt) {
this.logger.log(`fetch amount ${appt.patientID.nickname} owes`);
return await this.http.post(`${SERVER_URL}/sendtotaldue`, appt);
}
И, наконец, бэкэнд-функция (без данных). На бэкэнде отображается правильное количество, я просто не могу отобразить его на веб-интерфейсе:
module.exports.sendTotalDue = (req, res) => {
const appt = req.body;
// callback function that handles returning data
function done(err, results) {
const totaldue = parseInt(results, 10);
console.log(`API sendTotalDue CALLBACK done...totaldue: ${totaldue}`);
if (err) {
console.log('ERROR getting total due: callback error', err);
res.sendStatus(500).json(err); // server error; it'd be good to be more specific if possible
} else {
// end the request, send totaldue to frontend
console.log(`SUCCESS send totaldue to frontend ${totaldue}`);
res.status(200).json(totaldue);
}
}
// run first function
console.log(`1. getAmtDue:`);
this.getAmtDue(appt, done);
};
module.exports.getAmtDue(appt, callback) {
... function finds past visits, past payment and due totals
}
module.exports.getCurrentDue(appt, pastdueamt, callback) {
... function finds current visits and payments. calculates current due and adds the past due
callback(null, totaldue);
}
Может кто-нибудь помочь мне понять, что я делаю неправильно? Не стесняйтесь обдумать это, потому что именно так я себя чувствую в этот момент.
ИЗМЕНЕНО ДЛЯ ИСПРАВЛЕНИЙ ОШИБКИ, например, пропущенные ожидание и возвращение. Теперь я могу видеть значение, возвращаемое в сервисе данных, но я не определен в разделе функции карты.