Promise关联结果问题:如何让car对象包含完整serviceRecords数组?
问题解决:让car.serviceRecords包含所有服务记录
问题原因
你的hydrateCar函数里,循环时直接把car.serviceRecords赋值为单个服务记录,每次循环都会覆盖之前的值,最后自然只剩最后一条。另外,你手动给Xrm的API包裹了一层新Promise,属于冗余代码,没必要多此一举。
修改后的代码
1. 简化并修正getCar函数
getCar() { const id = this.route.snapshot.paramMap.get('id'); // Xrm的retrieveRecord本身就返回Promise,直接返回即可 return Xrm.WebApi.retrieveRecord('car', `${id}`) .then(car => { if (!car) { throw new Error('No Car Found!'); } // 提前初始化空数组,避免后续push报错 car.serviceRecords = []; return car; }); }
2. 修正hydrateCar函数
hydrateCar(car) { // 同样直接返回retrieveMultipleRecords的Promise return Xrm.WebApi.retrieveMultipleRecords('servicerecord', `?$filter=carid eq ${car.id}`) .then(results => { // 用push把每条记录加入数组,而不是覆盖 results.entities.forEach(result => { car.serviceRecords.push(result); }); return car; }); }
3. 修正函数调用的loading状态
this.getCar() .then((car) => { console.log('初始车辆数据:', car); return this.hydrateCar(car); }) .then(updatedCar => { console.log('包含所有服务记录的车辆:', updatedCar); this.loading = false; // 异步完成后再关闭加载 }) .catch((error) => { console.log(error); this.loading = false; // 出错也要关闭加载 });
关键修改点
- 给car提前初始化
serviceRecords空数组,确保后续能正常添加元素; - 把循环里的
car.serviceRecords = result改成car.serviceRecords.push(result),保留所有记录; - 去掉手动包裹的Promise,直接用Xrm API返回的Promise,简化代码;
- 把
this.loading = false移到Promise的回调里,保证异步操作完成后再更新状态。
内容的提问来源于stack exchange,提问作者DSmith
相关产品推荐
相关产品推荐

