Вы можете избежать использования вложенных подписок, используя один из «операторов отображения более высокого порядка» LINK
Это просто причудливый способ сказать: операторы, которые отображают входящее значение в другое наблюдаемый, подпишитесь на него и испустите эти значения. Они также автоматически управляют этими «внутренними подписками».
switchMap
будет «переключаться» на новую наблюдаемую при каждом получении нового значения. Поэтому, когда вы передаете «user», сопоставляете его с соответствующей наблюдаемой на основе user.role
, он подписывается на него и испускает эти значения. Когда получено новое значение «user», оно отписывается от предыдущих наблюдаемых и подписывается на новое.
Кроме того, вместо подписки в вашем компоненте вы можете определить «myOrders» как Observable , на который вы можете подписаться в шаблоне, например:
public myOrders$ = this.userData.getUser().pipe(
switchMap(user => {
return user.role = 'Admin'
? this.userData.GetAdminOrders()
: of(user.orders));
}
);
Затем вы можете использовать async
канал в вашем шаблоне. Это означает, что вам не нужно беспокоиться об управлении подписками в вашем компоненте.
<ul>
<li *ngFor="order of myOrders$ | async">{{ order.description }}</li>
</ul>