Как выполнить последовательные сервисные звонки? - PullRequest
4 голосов
/ 19 сентября 2019

Мне нужно позвонить 2 службам, а вторая должна вызываться с данными, полученными первой.Первый сервис возвращает массив объектов, который содержит идентификатор категории, и для каждого идентификатора мне нужно использовать второй сервис, чтобы получить элементы, связанные с указанным идентификатором.Проблема в том, что при использовании сервиса "items" подписка, похоже, не работает.

Я уже пытался вложить второй вызов в первый, чтобы объединить Observable, но безрезультатно.

categoriesArray: Category[];
categoryItemsArray: [CategoryItem[]];

this.firstService
      .query({ 'sectionId.equals': this.section.id })
      .pipe(
        filter((res: HttpResponse<Category[]>) => res.ok),
        map((res: HttpResponse<Category[]>) => res.body))
      .subscribe(
        categories => {
          this.categoriesArray = categories;
        },
        error => console.error(error),
        () => {
          this.categoriesArray.forEach(( category, index) => {
            console.log('entered ForEach loop');
            this.secondService.query({ 'categoryId.equals': category.id })
            .pipe(
              filter((res: HttpResponse<CategoryItem[]>) => res.ok),
              map((res: HttpResponse<CategoryItem[]>) => res.body))
            .subscribe( (categoryItems, index) => {
             console.log('second subscribe');
             this.categoryItemsArray[index] = categoryItems;             
            });
          });
      });

Вторая подписка не достигнута.

1 Ответ

1 голос
/ 19 сентября 2019

Не подписывайтесь в рамках подписки.После начала:

this.firstService
      .query({ 'sectionId.equals': this.section.id })
      .pipe(
        filter((res: HttpResponse<Category[]>) => res.ok),
        map((res: HttpResponse<Category[]>) => res.body),

мы переключаемся на другой поток, с оператором switchMap, подобным этому:

        switchMap(categories => forkJoin(
            categories.map(this.requestSingleCategory)
        ))

здесь n запросы отправляются одновременно.Осталось только подписаться и получить результаты:

    ).subscribe((categoryItems) => this.categoryItemsArray = categoryItems);

Я реорганизовал requestSingleCategory в отдельную функцию для удобства чтения:

private requestSingleCategory = ({ id }) => this.secondService.query({ 'categoryId.equals': id });

(Есть большая вероятность, что мои скобки отключены).

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