Слияние данных между запросами не должно быть обязанностью компонента.
Для этого и нужны услуги.
Пример того, как может выглядеть такой сервис (конечно, вы можете настроить его в соответствии с вашими потребностями):
const vehiclesIdNameMock: VehicleIdName[] = [
{ id: 'vehicle-1', name: 'Vehicle 1' },
{ id: 'vehicle-2', name: 'Vehicle 2' },
{ id: 'vehicle-3', name: 'Vehicle 3' },
];
const vehiclesIdToBrandMap: { [key: string]: VehicleIdBrand } = {
'vehicle-1': { id: 'vehicle-1', brand: 'Brand A' },
'vehicle-2': { id: 'vehicle-2', brand: 'Brand A' },
'vehicle-3': { id: 'vehicle-3', brand: 'Brand B' },
}
@Injectable()
export class VehiclesService {
private getVehiclesIdName(): Observable<VehicleIdName[]> {
return of(vehiclesIdNameMock).pipe(delay(500));
}
private getVehicleIdBrand(id: string): Observable<VehicleIdBrand> {
return of(vehiclesIdToBrandMap[id]).pipe(delay(500));
}
public getVehicles(): Observable<Vehicle[]>{
return this.getVehiclesIdName().pipe(
mergeMap(vehiclesIdName => {
const requests: Observable<VehicleIdBrand>[] = vehiclesIdName.map(vehicleIdName => this.getVehicleIdBrand(vehicleIdName.id))
return forkJoin(requests).pipe(
map(vehiclesIdBrand => vehiclesIdBrand.map(
(vehiclesIdBrand, index) => ({ ...vehiclesIdBrand, ...vehiclesIdName[index] })
))
);
})
)
}
}
Два приватных метода здесь являются ложными, потому что у меня, очевидно, нет доступа к вашей конечной точке, но пока вы возвращаете тот же тип данных, который будет в порядке.
Тогда ваш VehicleComponent будет таким же чистым, как:
@Component({
selector: 'app-vehicles',
templateUrl: './vehicles.component.html',
styleUrls: ['./vehicles.component.css']
})
export class VehiclesComponent {
public vehicles$: Observable<Vehicle[]> = this.vehiclesService.getVehicles();
constructor(private vehiclesService: VehiclesService) {}
}
Вот живая демонстрация на Stackblitz https://stackblitz.com/edit/angular-et3oug