Вам не нужно подписываться в коде getPresentationFields
, просто пройдите через Observable.
Грубый пример (не уверен, какую часть конфигурации вам нужно вернуть для просмотра / редактирования)
function getPresentationFields(actionType: string) {
return this.customerService
.getUserByID(this.id)
.pipe(
switchMap(user => this.presConfigService.getPresConfig(user.userTypeID)),
flatMap((configs) => configs),
filter((configs) => {
if(actionType == 'view'){
return configs.show;
}else if(actionType == 'edit'){
return configs.edit;
}
})
)
}
ИЛИ у вас может быть if-else где-то выше:
function getPresentationFields(actionType: string) {
const result$ = this.customerService
.getUserByID(this.id)
.pipe(
switchMap(user => this.presConfigService.getPresConfig(user.userTypeID))
);
if(actionType == 'view'){
return result$.pipe(
// ... get view data
);
} else if(actionType == 'edit'){
return result$.pipe(
// ... get edit data
)
}
}
Как правило, подписку на Observable нужно подписывать только там, где вы получаете результаты.
itможет даже случиться, что вы на самом деле не подписываетесь в своем коде, а пропускаете наблюдаемое где-то снаружи, например, с помощью angular | async
или redux effects
!
Так что в основном вы будете использовать такие операторы, как switchMap , mergeMap , ОбъединитьПоследние и т. д. для обработки ваших данных и передачи их подпискам, которые станут максимально тонкими.