【发布时间】:2019-10-21 12:34:09
【问题描述】:
我需要处理我有 3 个端点要调用并希望以最方便/有效的方式获取数据的情况。第一次调用可以独立处理并返回单个结果。第二个端点返回一个集合,但需要启动 0-* 后续调用,其中存在给定键。
理想情况下,希望将集合(来自第二个端点调用)作为包含来自第三个端点调用的结果的变异/新集合接收。
我目前正在使用 forkJoin(observableA$, observableB$) 来并行处理前 2 个调用,但我无法弄清楚如何包含顺序调用并将数据包含在 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
);
});
})
);
}
我希望该集合包含更多数据作为原始集合的新属性
更新
经过深思熟虑,也许我应该在解决方案的某个地方使用 reduce。这样我就可以控制什么被推入数组并且它可以是动态的?
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()
);
}
【问题讨论】: