Как использовать rxjs для нескольких внутренних вложенных подписок

В приведенном ниже коде я использовал подписку внутри подписки. Этот код работает, но структура кода очень плохая. Я хотел бы реорганизовать этот код с помощью rxjs(forkjoin или mergemap). Я не знаю, как этого добиться. Может кто-то помочь мне с этим? Любая помощь приветствуется.

this.chapservice.cycle().subscribe((current) => {
      this.selectedCycleId = current.ratingCycleId;
      this.chapService
        .getChapterEvalWithSkills(
          this.activeUser.ipn,
          this.selectedRatingCycleId
        )
        .subscribe((response) => {
          console.log("response", response);
          if (response && response.length > 0) {
            this.chapterEvals = response;
          }
        });
      this.chapservice
        .getIsitEmployeeStatus(this.activeUser.ipn, this.selectedCycleId)
        .subscribe((sdpStatus) => {
          this.activeUserStatus = sdpStatus;
       if (this.activeUserStatus.statusDescription == 'SUBMITTED') {
                 //do something
            }
        });
    });

person mohammed fahimullah    schedule 23.11.2020    source источник
comment
Внутренняя подписка: вы хотите, чтобы она была подписана на полный рабочий день или просто выполнялась один раз?   -  person deepak thomas    schedule 23.11.2020
comment
Необходимо выполнять полный рабочий день   -  person mohammed fahimullah    schedule 23.11.2020


Ответы (1)


Вы должны использовать комбинацию forkJoin и switchMap.

  • Почему switchMap? - потому что у вас есть зависимые значения, которые могут выполняться только последовательным выполнением.
  • Почему forkJoin? - Здесь вы можете использовать forkJoin или mergeMap.

Код

this.chapservice.cycle().pipe(
  switchMap((current: any) => 
     forkJoin(
        this.chapService.getChapterEvalWithSkills(
           this.activeUser.ipn,
           this.selectedRatingCycleId
        ),
        this.chapservice.getIsitEmployeeStatus(this.activeUser.ipn, current.ratingCycleId)
     )
  )
).subscribe(([chapterEvals, sdpStatus]) => {
      console.log(chapterEvals, sdpStatus);
      if (chapterEvals && chapterEvals.length > 0) {
        this.chapterEvals = chapterEvals;
      }
      this.activeUserStatus = sdpStatus;
      if (this.activeUserStatus.statusDescription == 'SUBMITTED') {
             //do something
        }
    });
});
person Pankaj Parkar    schedule 23.11.2020
comment
Спасибо за ваш ответ. Почему мы не можем использовать здесь карту слияния? - person mohammed fahimullah; 23.11.2020
comment
Я получаю 2 ошибки.! Свойство ratingycycleId не существует неизвестного типа. 2. свойство subscribe не существует для типа OperatorFunction‹неизвестно,[неизвестно,неизвестно]›. Есть идеи, почему? - person mohammed fahimullah; 23.11.2020
comment
@mohammedfahimullah попробуйте обновить (current: any) в switchMap, проверьте обновленный ответ - person Pankaj Parkar; 23.11.2020
comment
Свойство «subscribe» не существует для типа «OperatorFunction‹any, [Object, unknown]›» Что насчет этой ошибки? - person mohammed fahimullah; 23.11.2020
comment
@mohammedfahimullah проверьте обновленный ответ. Перед подпиской отсутствовала закрывающая скобка :D - person Pankaj Parkar; 23.11.2020
comment
Спасибо за ваш ответ. - person mohammed fahimullah; 23.11.2020
comment
Давайте продолжим обсуждение в чате. - person mohammed fahimullah; 23.11.2020