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
  }
});
Другие вопросы по тегам