Angular / RxJS - 链接两个http get调用

时间:2018-05-24 17:56:55

标签: angular asynchronous rxjs http-get

检索两个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'))
      );
  }

1 个答案:

答案 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);
      });
  }