Как я могу получить значения из двух наблюдаемых последовательно? - PullRequest
1 голос
/ 05 марта 2020

Я новичок ie с Rx Js.

Моя цель: (1) сделать первый вызов backend и получить значение, затем (2) на основе возвращенного значения, сделать другой вызов backend и возврат обоих значений в виде массива.

Когда я подписываюсь, я хотел бы получить оба значения: building и buildingUnit.

Это способ, которым я пытаюсь достичь этой цели :

this._buildingsService.loadBuilding(1).pipe(
  mergeMap((b: Building) => {
    if (b) {
      return this._buildingUnitsService.loadBuildingUnit(b);
    }
  })
).subscribe((bu: BuildingUnit) => {

});

Результат, который я хотел бы получить:

this._buildingsService.loadBuilding(1).pipe(
  mergeMap((b: Building) => {
    if (b) {
      return this._buildingUnitsService.loadBuildingUnit(b);
    }
  })
).subscribe((b: Building, bu: BuildingUnit) => {

});

Спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы можете просто отобразить второе значение в массив.

this._buildingsService.loadBuilding(1).pipe(
  mergeMap((b: Building) => {
    if (b) {
      return this._buildingUnitsService.loadBuildingUnit(b).pipe(
        map(c => [b, c]),
      );
    }
    return of([b]); // or `[b, undefined]` to be more obvious
  })
  .subscribe(([b, c]) => {
    // ...
  })
1 голос
/ 05 марта 2020

Вы можете использовать forkJoin для передачи обоих значений обратно:

this._buildingsService.loadBuilding(1).pipe(
  mergeMap((b: Building) => forkJoin({
    b: of(b),
    bu: b ? this._buildingUnitsService.loadBuildingUnit(b) : of(null)
  }))
).subscribe((result: { b: Building, bu: BuildingUnit  }) => {

});

DEMO: https://stackblitz.com/edit/angular-p5vtej

...