Как правильно связать наблюдаемые в серии вызовов API - PullRequest
0 голосов
/ 13 октября 2018

У меня есть пара вызовов API, которые зависят друг от друга.В частности, у меня возникают проблемы с возвращением окончательной Обсерватории: это приводит к зависанию приложения на неопределенное время.

Если я позвоню this.projectAttributeService.findAndUpdateByProjectAndMetumId({...}) сам по себе, а затем .subscribe, он, кажется, будет работать нормально.Это говорит о том, что это проблема с моей наблюдаемой цепочкой на внешнем интерфейсе.В настоящее время этот метод даже не вызывается на бэкэнде (у меня установлена ​​точка останова).

// .service

submitPhasesForm(projectId) {
  return this.activityDateService.activities$.pipe(
    first(),
    concatMap((activities: ActivityDate[]) => {
      this.activities = activities;
      if (this.activities.length === 0) {
        return observableOf({});
      }
      this.activities = activities.map(a => {
        a.project_program_id = parseInt(projectId, 10);
        return a;
      });
      return this.activityDateService.update(this.activities);
    }),
    mergeMap(() => {
      if (this.activities.length === 0) {
        return observableOf({});
      }
      return this.projectAttributeService.getAllMetadata(3).pipe(first())
    }),
    mergeMap((metaData: ProjectAttMetadataAPIResponse) => {
      if (this.activities.length === 0) {
        return observableOf({});
      }
      const metaDataId = (metaData as any).find(m => m.name === 'Phase').id;

    // EDIT: the problem ended up being with the synchronous 
    // this.getProjectPhase(this.activities) method below
      return this.projectAttributeService.findAndUpdateByProjectAndMetumId({
        project_program_id: parseInt(projectId, 10),
        value: this.getProjectPhase(this.activities),
        project_attrib_metum_id: metaDataId
      })
    })
  )
}

Это то, что выглядит findAndUpdateByProjectAndMetumId()например (кажется, что вызов работает нормально сам по себе):

findAndUpdateByProjectAndMetumId(body: ProjectAttribute): Observable < ProjectAttribute > {
  return this.http.put < ProjectAttribute > (`${ environment.API_URL }project-attribute`, body);
}

И здесь submitPhasesForm() вызывается:

// .component

import { forkJoin as observableForkJoin } from 'rxjs';

return this.projectService.patch(this.projectId, {
    summary: projectSummary || proj.summary
  }).pipe(
    first(),
    mergeMap(() => {
      return observableForkJoin(
        this.phasesFormDataService.submitPhasesForm(this.projectId).pipe(first()),
        this.pdpMetricsFormService.submitPdpForm(this.projectId).pipe(first()),
        this.projectStatusFormService.submitStatusForm(this.projectId).pipe(first())
      )
    })
  )
  .subscribe((res) => {
    this.router.navigate([`./pdp/${this.currentTab}/${this.projectId}`]);
  });

Два других вызова очень похожи, хотя и короче:

submitPdpForm(projectId) {
    return this.pdpMetricsForm$.pipe(
      first(),
      concatMap((formGroup: FormGroup) => {
        if (!formGroup.get('etRadioModel')) {
          return observableOf({});
        }

        const objSend = {...}
        return this.projectService.upsertPdpMetrics(projectId, objSend);
      })
    )
  }

...

submitStatusForm(projectId) {
    return this.metrics$.pipe(
      first(),
      tap(metrics => {
        this.metricsData = metrics;
      }),
      mergeMap(() => this.statusesForm$),
      observableMap(statusesForm => {
        const formGroup = statusesForm;

        if (!formGroup.get('resourceRationale')) {
          return {};
        }

        const obj = [{...}]

        return sendObj;
      }),
      mergeMap((sendObj: any) => {
        if (isEmpty(sendObj)) { return observableOf(sendObj) };
        return this.projectService.upsertMetrics(projectId, sendObj).pipe(first());
      })
    )

Что-то не так с тем, как я приковываю или называю эти Наблюдаемые?

Любая помощь очень ценится!

Я возвращаю of({}), если первое activities$ Observable не дает никаких данных, поэтому я могу провалиться через поток Observable, не делая ненужных вызовов API-- Я открыт для предложений по более изящному способу break из цепочки наблюдаемых.

1 Ответ

0 голосов
/ 14 октября 2018

Оказывается, у моего синхронного метода this.getProjectPhase(this.activities) была логическая ошибка, которая отправляла приложение в бесконечный цикл.

В противном случае операторы Observable работают нормально.

Я все же хотел бы найти более изящный способ вырваться из этого потока, если this.activities пусто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...