Мне нужно разобраться с ситуацией, когда у меня есть 3 конечных точки для вызова и я хочу получить данные наиболее удобным / эффективным способом. Первый вызов может быть обработан независимо и возвращает один результат. Вторая конечная точка возвращает коллекцию, но ей нужно будет инициировать 0- * последующие вызовы, где присутствует данный ключ.
В идеале хотелось бы получить коллекцию (из вызова 2-й конечной точки) как мутированную / новую коллекциюэто включает в себя результат 3-го вызова конечной точки.
В настоящее время я использую forkJoin (observableA $, observableB $) для обработки первых двух вызовов параллельно, но я не могу понять, как включить последовательные вызовы и получитьданные включены в observableB $
//Customer observable
const customer$ = this._customerManagementService.getCustomer(
accountNumber
);
return forkJoin({
customer: customer$,
saleCycles: saleCyclesWithVehicle$
}).pipe(finalize(() => this._loaderFactoryService.hide()));
getSalesWithVehicle(accountNumber: string, dealerKey: string) {
return this._salesCycleService
.getCyclesForCustomer({
customerNumber: accountNumber,
dealerKey: dealerKey
})
.pipe(
concatMap((results: ISaleCycle[]) => {
return results.map(cycle => {
return this._purchaseVehicleService.getPurchaseVehicle(
cycle.vehicleKey
);
});
})
);
}
Я ожидаю, что коллекция будет включать дополнительные данные в качестве нового свойства в исходную коллекцию
ОБНОВЛЕНИЕ
Подумав еще немного, возможно, мне следует использовать снижение где-нибудь в решении. Таким образом я могу контролировать, что толкает массив, и он может быть динамическим?
getSalesWithVehicle(accountNumber: string, dealerKey: string) {
return this._salesCycleService
.getCyclesForCustomer({
customerNumber: accountNumber,
dealerKey: dealerKey
})
.pipe(
switchMap((results: ISaleCycle[]) => {
return results.map(cycle => {
if (cycle.vehicleKey) {
return this._purchaseVehicleService
.getPurchaseVehicle(cycle.vehicleKey)
.pipe(
reduce((acc, vehicle) => {
return { cycle: cycle, vehicle: vehicle };
}, []),
toArray()
);
}
else {
///No extra data to be had
}
});
}),
concatAll()
);
}