Angular2: как заблокировать доступ к методам?
У меня в коде что-то вроде
class AuthenticationGuard implements CanActivate
async canActivate(...) {
console.log('canActivate....1');
const currentRole = this.settings.getCurrentRole();
if (!currentRole)
console.log('canActivate....2');
currentRole=await this.service.fetchAuthRoleFromServer(url);
в AuthenticationService у меня есть что-то вроде
class AuthenticationService{
constructor(sett:settings){
sett.initData(...);
и в классе настроек:
class settings
async initData(...){
console.log('initData....1');
const role = await roleService.getAuthenticated();
console.log('initData....2');
this.setCurrentRole(role);
console.log('initData....3');
и лог-файл выглядит, наконец, как
initData....1
canActivate....1
canActivate....2
initData....2
initData....3
Есть ли способ заблокировать метод this.settings.getCurrentRole()
пока, по крайней мере, я не достиг initData....3
(в том же классе [settings
])?
Я попытался провести некоторые исследования семафоров, но как-то не смог их запустить (в Angular)... Либо я неправильно установил пакет, либо... Но, возможно, есть более подходящее решение...
ОБНОВЛЕНИЕ: После некоторых исследований я обнаружил, что проблема тесно связана с механизмом защищенного маршрута, и на самом деле мне нужно инициализировать некоторые данные, когда в canActivate мне нужно проверить, что уже вошел в систему. Если нет, то либо получите содержание или перейти на страницу входа. Но в любом случае механизм довольно странный.
1 ответ
Это работает для Angular 2/4 и для AngularJS
Вы можете добавить Behavior Subject к вашей функции 'initdate' (которая может быть логическим или числом):
class settings
isInitDone = new BehaviorSubject<boolean>(false);
async initDate(...){
console.log('initData....1');
const role = await roleService.getAuthenticated();
console.log('initData....2');
this.setCurrentRole(role);
console.log('initData....3');
//give a new value to this subject
this.isInitDone.next(true);
}
это потребовало бы, чтобы класс Auth подписывался на изменения этой темы:
class Auth...
async canActivate(...) {
console.log('canActivate....1');
this.settings.isInitDone.subscribe(isAvailable => {
if (isAvailable) {
//Do your stuff
}
});