typescript Angular -基于另一个服务修改数据并返回可观察的

vi4fp9gy  于 2022-12-05  发布在  TypeScript
关注(0)|答案(1)|浏览(121)

我有一个返回车辆列表的服务。我需要获取每辆车的驱动程序,并为巴士设置它。到目前为止,我已经以这样的方式实现了它:

return this.getVehicles().pipe(
      // Set the driver
      map((res) => {
        res.items = res.items.map((vehicle) => {
          if (vehicle.driver_id !== "") {
            this.driverSvc.get(vehicle.driver_id).subscribe((data) => {
              vehicle.driver = data;
            })
          }
          return vehicle;
        })
        return res;
      }),
      map((res) => {
        // This map needs to have the driver!
        console.log(vehicle.driver) // Undefined in all cases, where it should be set for one of the entries
      })

我知道console.log(vehicle.driver)记录undefined是因为订阅。是否有其他方法可以根据其他服务的响应修改我的响应?

rqenqsqc

rqenqsqc1#

正如我已经提到的,你需要使用switchMap操作符将两个可观测量组合成一个链。下面的例子可能对你有用:

return this.getVehicles.pipe(
            // load the driver
            switchMap((response) =>
                zip(
                    ...response.map((vehicle) =>
                        this.driverSvc.get(vehicle.driver_id).pipe(map((driver) => {
                            vehicle.driver = driver;
                            return vehicle;
                        })),
                    ),
                ),
            ),
            map((responseWithDriver) => {
                // this map needs to have the driver!
                console.log(responseWithDriver);
            }),
        );

switchMap允许我们使用一个新的可观察值作为返回值,zip操作符允许我们将多个调用组合为一个返回值。

相关问题