将承诺附加到另一个结果

问题描述 投票:0回答:1

我正在处理两个 Promise,并对其进行了简化,以使事情更容易查看。

注意 Cars 和 ServiceRecords 是 2 个不同的表。

我希望我的最终数据集看起来像这样:

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
       }
     ]
}

第一个承诺

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!'));
      }
    });
  }

第二个承诺

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);
      });
    });
  }

调用函数

this.getCar().then((car) => {
      console.log('car', car);
      return this.hydrateCar(car);
    })
      .catch((error) => {
        console.log(error);
      });
    this.loading = false;
  }

我得到的只是服务记录的最后一次迭代。我希望关键的 car.ServiceRecords 是所有记录的数组。

javascript es6-promise
1个回答
0
投票
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);
    });
  });
}

您面临的问题是您在 HydroCar 函数的循环的每次迭代中覆盖了 car.serviceRecords 属性。相反,您应该将服务记录累积到一个数组中。

© www.soinside.com 2019 - 2024. All rights reserved.