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

#angular #typescript #rxjs-observables

#angular #typescript #rxjs-наблюдаемые

Вопрос:

В приведенном ниже коде я использовал subscribe внутри subscribe. Этот код работает, но структура кода очень плохая. Я хотел бы реорганизовать этот код с помощью 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 amp;amp; 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
            }
        });
    });
 

Комментарии:

1. Внутренняя подписка вы хотите, чтобы она была подписана на полный рабочий день или выполнялась только один раз

2. Необходимо выполнять полный рабочий день

Ответ №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 amp;amp; chapterEvals.length > 0) {
        this.chapterEvals = chapterEvals;
      }
      this.activeUserStatus = sdpStatus;
      if (this.activeUserStatus.statusDescription == 'SUBMITTED') {
             //do something
        }
    });
});
 

Комментарии:

1. Спасибо за ваш ответ. Почему мы не можем использовать карту слияния в этом?

2. Я получаю 2 ошибки .!.Свойство ratingycycleId не существует неизвестного типа. 2.свойство subscribe не существует для типа OperatorFunction<неизвестно,[неизвестно, неизвестно]> . Есть идеи, почему?

3. @mohammedfahimullah попробуйте обновить (current: any) switchMap , проверьте обновленный ответ

4. Свойство ‘subscribe’ не существует для типа ‘OperatorFunction<any, [Object, unknown]>’ Что насчет этой ошибки?

5. @mohammedfahimullah проверьте обновленный ответ. Закрывающая скобка отсутствовала перед подписью: D