#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