I am working with two promises and have simplified this to make things easier to look at.
Note Cars and ServiceRecords are 2 different tables.
I would like my end dataset to look like this:
car = {
make: Honda,
color:red,
id:12,
serviceRecords:[
{type: oil change,
customerHappy: Yes,
id:1
carid:12
},
{type: oil change,
customerHappy: no
id:2
carid:12
}
]
}
First Promise
getCar() {
return new Promise((resolve, reject) => {
const id = this.route.snapshot.paramMap.get('id');
// find the car we want
const car = Xrm.WebApi.retrieveRecord('car', `${id}`);
if (car ) {
resolve(car ); // send the car
} else {
reject(Error('No Car Found!'));
}
});
}
Second Promise
hydrateCar(car) {
return new Promise((resolve, reject) => {
const services:any = Xrm.WebApi.retrieveMultipleRecords('servicerecord', `?$filter=carid eq ${car.id}`).then((results) => {
for (let i = 0; i < results.entities.length; i++) {
const result = results.entities[i];
car.serviceRecords=result;
}
resolve(car);
});
});
}
Call the function
this.getCar().then((car) => {
console.log('car', car);
return this.hydrateCar(car);
})
.catch((error) => {
console.log(error);
});
this.loading = false;
}
All I get back is the last iteration of the service record. I would like the key car.ServiceRecords to be an array of all the records.
>Solution :
hydrateCar(car) {
return new Promise((resolve, reject) => {
Xrm.WebApi.retrieveMultipleRecords('servicerecord', `?$filter=carid eq ${car.id}`).then((results) => {
const serviceRecords = [];
for (let i = 0; i < results.entities.length; i++) {
const result = results.entities[i];
serviceRecords.push(result);
}
car.serviceRecords = serviceRecords;
resolve(car);
});
});
}
The issue you’re facing is that you’re overwriting the car.serviceRecords property in each iteration of your loop in the hydrateCar function. Instead, you should accumulate the service records into an array.