Angular 6+, как звонить в несколько внутренних наблюдаемых сервисов и ждать, пока форма результата не будет получена - PullRequest
1 голос
/ 14 июня 2019

У меня есть файл component-A.ts, у которого есть метод A (), который вызывает метод B () из service B () (метод, который я пытался сделать его наблюдаемым, поэтому я не уверен, что я все сделал правильно), как то так

FacilityDetailGridComponent.ts

updateNursingUnitList(getUpdate: boolean) {

    const recipeObs = this.nursingUnitEditableTableService.updateNursingUnitList(getUpdate, this.projectID, this.facilityID);

    recipeObs.subscribe(
      data => {
        this.nursingUnitList = data;
      }
    );
  }

Мне нужно остановиться на этом этапе, чтобы получить полный / полный ответ, затем продолжить,

В method-B () из service-B () я вызываю метод-C () из Service-C (), который также является Observable (и я уверен, что он работает должным образом), как это

NursingUnitEditableTableService.ts

updateNursingUnitList(getUpdate: boolean, projectID: number, facilityID: number): Observable<any[]> {

    if (getUpdate == true) {

      this.nursingUnitService.getAllUnits(projectID, facilityID).subscribe(
        (data: nursingUnit[]) => {
          return of(data);
        },
        error => {
          if (error.status == 400) {
            this.errorMsg = "Bad Request Error";
            return of(null);
          }
          if (error.status == 404) {
            this.errorMsg = error.error;
           return of(null);
          }
        }
      )
    } else {
      return of(null);
    }    
  }

Service-C () и method-c () примерно такие,

NursingUnitService.ts

  getAllUnits(projectID: number, facilityID: number): Observable<nursingUnit[]> {
    return this.http.get<nursingUnit[]>(this.baseUrl + `api/FacilityProperties/GetAllUnits/${projectID}/${facilityID}`);
  }

Итак, как вы можете видеть, мне нужно изменить промежуточный сервис (Service-B и Method-B ()) так, чтобы он каким-то образом ожидал внутренний сервис и метод (Service-C и method-C (), которым он является. уже наблюдаемый), чтобы получить полное восстановление, затем возврат (finalResopne) к компоненту, который вызвал его (компонент-A, метод-A ())

Заранее большое спасибо за помощь!

1 Ответ

1 голос
/ 14 июня 2019

Вы можете использовать оператор mergeMap в rxjs для объединения вызовов служб.

Пример:

import { Component } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { mergeMap } from 'rxjs/operators';

@Component({
  selector: 'app-root',
  templateUrl: 'app/app.component.html'
})
export class AppComponent {
  homeworld: Observable<{}>;
  constructor(private http: HttpClient) { }

  ngOnInit() {
    this.homeworld = this.http.get('/api/people/1').pipe(
      mergeMap(character => this.http.get(character.homeworld))
    );
  }
}

В этом примере используется mergeMap также известный как flatMap для отображения / итерации по наблюдаемым значениям .

Так что в нашем примере, когда мы получаем домашний мир, мы возвращаем Observable внутри нашего потока символов Observable.Это создает вложенную Observable в Observable.

Оператор mergeMap помогает нам подписаться и извлечь значение из внутреннего Observable и передать его обратно в родительский поток.Это немного сжимает наш код и устраняет необходимость во вложенной подписке.

Это выглядит примерно так ( source ]:

diagram of mergeMap observables

...