否定守卫的承诺结果

Chr*_*uez 4 promise typescript angular2-routing angular

我有一个工作的angular2警卫,其中一个canActivate()调用服务isLoggedIn()并返回一个承诺然后解决,并且路线被适当地处理.

但是,我试图做相反的事情,看看用户何时没有登录,并且它无法正常工作.

我尝试了一些简单的事情(添加一个!运算符),希望它能工作:

@Injectable()
export class AuthGuard implements CanActivate {
    constructor(private authService: AuthService) {}

    canActivate() {
        return !this.authService.isLoggedIn();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这总是返回一个假值,并且路径永远不会激活.

这是我的isLoggedIn()功能的相关摘录:

isLoggedIn(): Promise<Boolean> {
  var component = this;
  return new Promise((resolve, reject) => {       
      component.queryForUser((user) => {
        resolve(user != null);
      });
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

如果用户不等于null,则他登录并且promise以true结算.否则,错误.

虽然我可以简单地添加一个参数来指定我正在寻找的状态,或者甚至创建一个isNotLoggedIn()具有相同逻辑但反转的函数,我问,有没有办法否定承诺的决心的价值canActivate()

Est*_*ask 7

return !this.authService.isLoggedIn()因为JS的工作方式不会起作用.this.authService.isLoggedIn()是承诺对象并且是真实的.!this.authService.isLoggedIn()永远都是假的.

相反,promise结果应映射到否定结果

canActivate() {
    return this.authService.isLoggedIn().then(result => !result);
}
Run Code Online (Sandbox Code Playgroud)

要么

async canActivate() {
    return !(await this.authService.isLoggedIn());
}
Run Code Online (Sandbox Code Playgroud)

括号周围await ...是可选的,用于可读性.


car*_*ant 5

您需要做的就是进一步操纵承诺的解析值:

canActivate() {
    return this.authService.isLoggedIn().then(loggedIn => !loggedIn);
}
Run Code Online (Sandbox Code Playgroud)