Я использую forkJoin для выполнения нескольких запросов к серверу. Это шаблон, который я обычно использую в своем приложении, и он отлично работает. Однако мы только начали реализовывать роли пользователей, которые выполняются на бэкэнде. Я не уверен, что лучше всего использовать для реализации ролей, поскольку я в основном разработчик внешнего интерфейса, тем не менее, это проблема, с которой я столкнулся:
В нашем приложении есть роли участника и администратора.
Из каждого представления я должен совершать вызовы на серверную часть для ролей участников и администраторов, независимо от того, что роли не определены во внешнем интерфейсе.
Данные участников всегда возвращаются для обеих ролей, поскольку у членов и администраторов есть личные данные.
Запросы, сделанные для данных администратора, возвращаются только тогда, когда пользователь является администратором. Всякий раз, когда у пользователя нет прав администратора, запрос возвращает ошибку 401. Вот тут у меня проблема.
Всякий раз, когда вызов возвращает 401, вызывается метод ошибки в моем методе подписки, и у меня нет доступа ни к одному из вызовов, которые были сделаны, включая вызовы, связанные с данными члена.
В моем включенном коде в forkJoin есть пять вызовов, переданных в метод. Третий и четвертый вызовы возвращают данные только в том случае, если пользователь является администратором, в то время как остальные вызовы всегда возвращаются либо для участника, либо для администратора.
Когда пользователь не является администратором, третий вызов возвращает 401, и поток останавливается, и вызывается обработчик ошибок в моем методе подписки. Это явно не то, чего я хочу. Я хочу, чтобы поток продолжался, чтобы я мог использовать данные в методе _data.
Я использую RXJS только 6 месяцев и учусь. Может быть, мне следует использовать другой шаблон или, может быть, есть способ исправить это. Любая помощь с примерами кода будет принята с благодарностью. Ниже моего примера кода я включил еще один пример кода, в котором я попытался решить проблему, поэкспериментировав с методами catch. Это не сработало.
Метод получения моего представления:
private getZone() {
this.spinner.show();
this.zonesService.getZone(this.zoneId)
.map(response => {
this.zone = response['group'];
return this.zone;
})
.flatMap(() => {
return Observable.forkJoin(
this.teamsService.getTeam(this.zone['TeamId']),
this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'),
this.zonesService.getZoneAssociations(this.zone['id'], '/devices'),
this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers'),
this.sitesService.getSite(this.zone['SiteId'])
);
})
.subscribe(
_data => {
// data handling...
},
_error => {
// error handling ...
}
);
}
Моя попытка исправить:
private getZone() {
this.spinner.show();
this.zonesService.getZone(this.zoneId)
.map(response => {
this.zone = response['group'];
return this.zone;
})
.flatMap(() => {
return Observable.forkJoin(
this.teamsService.getTeam(this.zone['TeamId']),
this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'),
this.zonesService.getZoneAssociations(this.zone['id'], '/devices')
.catch(error => Observable.throw(error)),
this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers')
.catch(error => Observable.throw(error)),
this.sitesService.getSite(this.zone['SiteId'])
);
})
.subscribe(
_data => {
// data handling...
},
_error => {
// error handling...
}
);
}