I have a method that performs some basic mathematical calculations in my Ionic
app after fetching data from SQLite
DB. I want to show these results on a page but the problem is that I am not sure how to put all these calculated values in an object array.
I tried following but the editor is complaining about not resolving promises. To me it looks like I already resolved them by extracting a numeric value from each and assigning them to local variables such as grossMarketable, aphMarketable, amountSold
and totalContractDollarAmount
.
home.ts
private calculate() { console.log("**********Starting calculations now....."); let calculations: CalcModel[] = []; for (let i = 0; i < this.userCropTxModels.length; i++) { let userCropTxModel = this.userCropTxModels[i]; console.log("userCropTxModel: " + userCropTxModel); let grossMarketable = this.userCropProvider.getGrossMarketableByCropId(userCropTxModel.cropId) .then(grossMarketable => { console.log("grossMarketable: " + grossMarketable); return grossMarketable; }) .catch((e) => console.error(JSON.stringify(e))); let aphMarketable = this.userCropProvider.getAPHMarketableByCropId(userCropTxModel.cropId) .then(aphMarketable => { console.log("aphMarketable: " + aphMarketable); }) .catch((e) => console.error(JSON.stringify(e))); let amountSold = this.userContractProvider.getTotalContractedBushelsByCropId(userCropTxModel.cropId) .then(amountSold => { console.log("amountSold: " + amountSold); }) .catch((e) => console.error(JSON.stringify(e))); let totalContractDollarAmount = this.userContractProvider.getTotalContractDollarAmountByCropId(userCropTxModel.cropId) .then(totalContractDollarAmount => { console.log("totalContractDollarAmount: " + totalContractDollarAmount); }) .catch((e) => console.error(JSON.stringify(e))); console.log("grossMarketable: " + grossMarketable); console.log("aphMarketable: " + aphMarketable); console.log("amountSold: " + amountSold); console.log("totalContractDollarAmount: " + totalContractDollarAmount); /************************************************** //THE EDITOR IS SHOWING RED MARKS BELOW ***********************************************/ calculations.push({ cropName: 'Corn', grossMarketable: grossMarketable, grossMarketable: grossMarketable, amountSold: amountSold, totalContractDollarAmount: totalContractDollarAmount }); } console.log("calculations: " + calculations); }
user-crop.ts (code snippet of UserCropProvider)
getGrossMarketableByCropId(cropId: number): Promise<number> { return this.databaseProvider.getDatabase().then(database => { return database.executeSql(SQL_SELECT_GROSS_MARKETABLE_BY_CROP_ID, [cropId]) .then((data) => { let grossMarketable: number = 0; for (let i = 0; i < data.rows.length; i++) { grossMarketable = data.rows.item(i).GROSS_MARKETABLE } return grossMarketable; }); }); }
CalcModel.ts
export interface CalcModel { cropName: string; grossMarketable: number; aphMarketable: number; amountSold: number; totalContractDollarAmount: number; }
Advertisement
Answer
Create a promise.all for each user crop model, with inside the list of promises of your async requests.
When you resolve the inner ones, get back a single calculation object. When you resolve all of them, get your calculations list:
Your code should look something like:
private calculate() { const promises: Promise<any>[] = []; for (let i = 0; i < this.userCropTxModels.length; i++) { let userCropTxModel = this.userCropTxModels[i]; promises.push(Promise.all([ this.userCropProvider.getGrossMarketableByCropId(userCropTxModel.cropId), this.userCropProvider.getAPHMarketableByCropId(userCropTxModel.cropId), this.userContractProvider.getTotalContractedBushelsByCropId(userCropTxModel.cropId), this.userContractProvider.getTotalContractDollarAmountByCropId(userCropTxModel.cropId) ]).then(data => ({ cropName: 'Corn', grossMarketable: data[0], amountSold: data[1], totalContractDollarAmount: data[2] }))); } Promise.all(promises).then(calculations => console.log(calculations)); }
EDIT
A bit of refactor. I don’t know if it works, I am just coding without even trying, but just a bit cleaner:
private calculate() { const promises: Promise<any>[] = this.userCropTxModels.map(userCropModel => Promise.all([ this.userCropProvider.getGrossMarketableByCropId(userCropModel.cropId), this.userCropProvider.getAPHMarketableByCropId(userCropModel.cropId), this.userContractProvider.getTotalContractedBushelsByCropId(userCropModel.cropId), this.userContractProvider.getTotalContractDollarAmountByCropId(userCropModel.cropId) ]).then(data => ({ cropName: 'Corn', grossMarketable: data[0], amountSold: data[1], totalContractDollarAmount: data[2] }))); Promise.all(promises).then(calculations => console.log(calculations)); }
You can even use async/await if you want to write sync/style code