Итак, у меня есть куча обещаний, которые мне нужно хранить в разных переменных, которые затем будут значениями для разных ключей объектов, этот объект будет возвращен API и передан пользователю.
Проблема, с которой я сталкиваюсь, заключается в том, что она медленная (от 150 мс до 1000 мс).
Есть ли лучший способ быстрее выполнить все эти обещания? или просто их избегать? Невозможно использовать Promise.all (), так как все значения должны храниться в разных переменных.
const scheduledTotalExVat = await calculateFieldTotal(scheduledMilestones, 'totalPriceExVat');
const scheduledTotalIncVat = await calculateFieldTotal(scheduledMilestones, 'totalPriceIncVat');
const achievedTotalExVat = await calculateFieldTotal(achievedMilestones, 'totalPriceExVat');
const achievedTotalIncVat = await calculateFieldTotal(achievedMilestones, 'totalPriceIncVat');
const invoicedTotalExVat = await calculateFieldTotal(invoicedMilestones, 'totalPriceExVat');
const invoicedTotalIncVat = await calculateFieldTotal(invoicedMilestones, 'totalPriceIncVat');
const paidTotal = await calculateFieldTotal(paidMilestones, 'amountPaid');
const totalExVat = await calculateFieldTotal(allMilestones, 'totalPriceExVat');
const totalIncVat = await calculateFieldTotal(allMilestones, 'totalPriceIncVat');
const quotationTotalExVat = await calculateFieldTotal(projectQuotations, 'totalPriceExVat');
const quotationTotalIncVat = await calculateFieldTotal(projectQuotations, 'totalPriceIncVat');
const summary = {
milestonesScheduledExVat: scheduledTotalExVat,
milestonesScheduledIncVat: scheduledTotalIncVat,
milestonesAchievedExVat: achievedTotalExVat,
milestonesAchievedIncVat: achievedTotalIncVat,
milestonesInvoicedExVat: invoicedTotalExVat,
milestonesInvoicedIncVat: invoicedTotalIncVat,
milestonesPaid: paidTotal,
milestonesTotalExVat: totalExVat,
milestonesTotalIncVat: totalIncVat,
unbilledTotalExVat: quotationTotalExVat - paidTotal,
unbilledTotalIncVat: quotationTotalIncVat - paidTotal,
};
return summary;
Эта функция CalculateFieldTotal () является не чем иным, как кратким кодом для l oop через массив объектов и добавьте значение для указанного c поля.
async function calculateFieldTotal(arrayOfObjects, fieldToCalculate) {
if (!arrayOfObjects || !fieldToCalculate) {
throw new Error('Missing fields for calculation.');
}
return (
arrayOfObjects
.map(obj => parseFloat(obj[fieldToCalculate]))
.reduce((acc, current) => acc + current, 0) || 0
);
}
Мне не очень нравится, как это выглядит, но я не могу найти более масштабируемый или красивый способ сделать это.
Заранее спасибо.