Технически, ваш код в порядке, но лучше избегать вложения, потому что это приводит к ситуации, которая имеет обещания - ад обратного вызова.Если вы избегаете вложения, это делает ваш код более читабельным / понятным.
Если ваша внутренняя наблюдаемая зависит от внешней наблюдаемой, тогда необходимо выполнить вложение, в противном случае вы можете просто составить те, которые наблюдаются, чтобы создать объединенное значение в вашемнаблюдаемый конвейер.
В вашем примере -
Если ваши категории и пользователи независимы, то вы должны сделать следующее, чтобы избежать вложения -
function userservice() {
return combineLatest( //or you can use zip operator as per your requirement
this.store.pipe(
select(fromRoot.getCategories),
take(1)),
this.otherstore.pipe(
select(fromRoot.getUsers),
take(1))
).pipe(
switchMap(([categories, users]) => {
return httpClient.get( apistuff with params user and category);
})
);
Если пользователи зависят от категорий, то вы можете сделать следующее [этот пример просто показывает требуемую вложенность;не относится к вашему сценарию] -
function userservice() {
return this.store.pipe(
select(fromRoot.getCategories),
take(1),
switchMap(categories => {
return this.httpClient.get(/*get users for categories*/)
.pipe(
switchMap(users => this.httpClient.get( //apistuff with params user and category))
);
})
)
}
Вы можете избежать вложения в приведенный выше код, изменив код, как показано ниже -
function userservice() {
return this.store.pipe(
select(fromRoot.getCategories),
take(1),
switchMap(categories => {
return zip(this.httpClient.get(/*get users for categories*/), of(categories)); //you can use combineLatest as well as per your need
}),
switchMap(([users, categories]) => {
return httpClient.get( apistuff with params user and category);
})
)
}