Я получаю данные из базы данных в этой форме.
существует массив объектов, и каждый объект выглядит следующим образом.
},
{
"vehicleId": 2287,
"plateNumber": "GGS-733",
"vehicleTypeId": 1,
"driverId": null,
"garageId": 1,
"statusId": 0,
"vehicleModelId": 18,
"additionalInfo": null,
"techInspectDate": "00:00:00",
"person": null
},
{
Я также получаю списки объектов, включенных сюда отдельно.(garageId, statusId, vehicletypeId).Каждый из них имеет разные значения (например, vehicleType).Я хочу правильно сопоставить их с новым объектом, который вместо идентификаторов будет иметь значения этих объектов.
Я хочу получить конечный результат для объекта, который будет выглядеть следующим образом.
},
{
"vehicleId": 2287,
"plateNumber": "GGS-733",
--> "vehicleType": "SUV",
--> "driver": "John Smith",
--> "garage": "Boston",
--> "statusId": "available",
"vehicleModelId": 18,
"additionalInfo": null,
"techInspectDate": "00:00:00",
"person": null
},
{
Есть несколько проблем, с которыми я сталкиваюсь.Мне нужно подождать, пока все списки будут полностью извлечены, пока я не попытаюсь сопоставить все с новым объектом.Мне нужно, чтобы порядок асинхронных событий был правильным.И я не могу оставлять списки в отдельных объектах и получать к ним доступ при необходимости.Мой конечный результат должен быть одним объектом, как указано ранее, и мне нужно передать его функции, которая позже будет отображать его значения во внешнем интерфейсе.
В настоящее время я получаю список гаражей и других подобных объектов.
public getGarages(): Observable<any[]> {
const url = `${this.serviceUrl}lists/garages`;
return this.http.get<any[]>(url);
}
Ранее база данных давала мне целое дерево.Это означает, что автомобили включали весь объект гаража, а не просто гараж.Таким образом, у меня была функция getVehicles, выполняющая сопоставление для каждого из его объектов, принимая дочерние значения и копируя их в новое значение в объекте.но теперь у меня есть только Id.
getVehicles(): Observable<Vehicle[]> {
const url = `${this.serviceUrl}`;
return this.http.get<Vehicle[]>(url).pipe(
tap(vehiclesArray => vehiclesArray.forEach(element => {
// element.garageName = element.garage.garageName;
// element.status = element.vehicleStatus.status;
// element.vtype = element.vehicleType.vehicleType;
// element.ownerName = element.owner.ownerName;
// element.vehicleModelName = element.vehicleModel.vehicleModelName;
})));
}
Одна из моих мыслей - создать какой-то счетчик, проверяющий, все ли подписки завершены, чтобы в основной функции транспортных средств я знал, что получил вседанные готовы.
Еще одна мысль, которую я получил, состояла в том, чтобы позволить одной функции вызывать другую, пока я не доберусь до функции основных транспортных средств, но это может замедлить процесс, потому что вызовы будут происходить последовательно, а не одновременно.время.
Как мне достичь конечного результата? Каков эффективный и правильный подход?