You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:02:42