检索两个http异步调用的结果时遇到问题。
第一条路线叫/contracts
,第二条路线叫/shipments
每份合同都与货件相关,因此它具有shipmentId
属性。
我想检索所有合同,并且每个合同都从我的REST服务器获取他们各自的货物。
我尝试同时调用getContracts()
和getShipments()
,然后调用forEach合同在我的shipments[]
中使用find(来自getShipments()
方法的结果),但有时出货称为响应在合同调用响应后返回,因此返回cannot read property x of undefined
错误。
我也尝试使用getShipmentById()
,但这并不能保证我在合同签订后会一直退货。
如何使用Angular / RxJS实现这一目标?
以下是我的代码的相关部分:
getContracts(): Observable<Contract[]> {
return this.http.get<Contract[]>(this.contractsUrl)
.pipe(
retry(3),
catchError(this.handleError('getContracts', []))
);
}
getShipments(): Observable<Shipment[]> {
return this.http.get<Shipment[]>(this.shipmentsUrl)
.pipe(
retry(3),
catchError(this.handleError('getShipments', []))
);
}
getShipmentById(id: string): Observable<Shipment | {}> {
return this.http.get<Shipment>(`${this.shipmentsUrl}/${id}`)
.pipe(
retry(3),
catchError(this.handleError('getShipmentById'))
);
}
答案 0 :(得分:0)
forkJoin
成功了。
谢谢你的回答,我不知道这个功能。 我在这里发布代码可能会帮助其他人解决这个问题:
getContracts(): void {
forkJoin(
this.contractService.getContracts(),
this.shipmentService.getShipments()
)
.subscribe(([contracts, shipments]) => {
if (Array.isArray(contracts) && Array.isArray(shipments)) {
this.contracts = contracts
.map(contract => {
contract.shipment = shipments.find(shipment => shipment.shipmentId === contract.shipmentId);
return contract;
});
}
console.log(contracts);
});
}