Как выполнить асинхронную задачу при определении разрешения с использованием библиотеки угловых разрешений - PullRequest
0 голосов
/ 26 февраля 2019

Я использую Angular-Разрешение Библиотека вместе с UI-маршрутизатор и Satellizer .

Ниже приводится определение состояния для home.В этом я проверяю, авторизован ли пользователь, используя angular-Разрешение .

$stateProvider.state('500', home);
var home = {
  abstract: true,
  url: '/home',
  data: {
    permissions: {
      only: ['loggedin',],
      redirectTo: {
        loggedin: 'login',
      },
    }
  },
  templateUrl: 'components/home/home.view.html',
  controller: 'HomeCtrl as home'
};

Ниже приведено определение разрешения для loggedin

PermPermissionStore.definePermission('loggedin', isAuthenticated);

function isAuthenticated(permissionName, transitionProperties) {
  // check if token is valid.
  if ($auth.isAuthenticated()) {
    return true;
  }
  // if not then refresh token
  return tokenRestService.refresh().then(
    function (response) {
      if (response != null) {
        $auth.setToken(response);
      }
    },
    function (response) {
      localStorage.removeItem('user');
    }
  );
}

Но в некоторой степени это не работает, когда я выполняю асинхронный вызов.Если я изменю функцию isAuthenticated следующим образом, то она будет работать правильно, но мне нужно обновить токен, если в случае истечения срока действия токена, в противном случае, перенаправить пользователя на страницу входа.

function isAuthenticated(permissionName, transitionProperties) {
  if ($auth.isAuthenticated()) {
    return true;
  }
  return false;
}

С doc angular-Разрешения:

Иногда вам нужно будет вызвать какой-то бэкэнд API или выполнить другую асинхронную задачу, чтобы проверить, действительно ли разрешение все еще действует.Для этого вы можете использовать обещания и просто вернуть их из функции проверки:

PermPermissionStore
  // Define user permission calling back-end
  .definePermission('hasValidSession', /*@ngInject*/function (Session) {
    // Let's assume that Session service calls backend API via $http and return promise:
    // -- $q.resolve() means that session is active 
    // -- $q.reject() means that session expired
    return Session.checkSession();
  });

Но когда я использую службу в definePermission, она просто проходит без перенаправления.

1 Ответ

0 голосов
/ 27 февраля 2019

Следуйте документации:

 -- $q.resolve() means that session is active 
 -- $q.reject() means that session expired

Возврат разрешенных или отклоненных обещаний методу .then:

PermPermissionStore.definePermission('loggedin', isAuthenticated);

function isAuthenticated(permissionName, transitionProperties) {
  // check if token is valid.
  if ($auth.isAuthenticated()) {
    return true;
  }
  // if not then refresh token
  return tokenRestService.refresh().then(
    function (response) {
      if (response != null) {
        $auth.setToken(response);
      }
      return $q.resolve();
    },
    function (response) {
      localStorage.removeItem('user');
      return $q.reject();
    }
  );
}
...