Angular2:如何锁定方法访问?

时间:2017-09-15 08:11:22

标签: angular angular-ui-router

我的代码中有类似

的内容
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 个答案:

答案 0 :(得分:0)

适用于Angular 2/4,and for AngularJS

您可以在“初始化”中添加行为主题' function(可以是布尔值或数字):

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
  }
});