我有一个工作的angular2 guard,带有一个canActivate(),它调用isLoggedIn()的服务并返回一个promise然后解析并且路由被适当地处理.
但是,我试图做相反的事情,看看用户何时没有登录,并且它无法正常工作.
我尝试了一些简单的事情(添加一个!运算符),希望它可以工作:
@Injectable() export class AuthGuard implements CanActivate { constructor(private authService: AuthService) {} canActivate() { return !this.authService.isLoggedIn(); } }
但是,这总是返回一个假值,并且路径永远不会激活.
这是我的isLoggedIn()函数的相关摘录:
isLoggedIn(): Promise<Boolean> { var component = this; return new Promise((resolve,reject) => { component.queryForUser((user) => { resolve(user != null); }); } }); }
如果用户不等于null,则他登录并且promise以true结算.否则,错误.
虽然我可以简单地添加一个参数来指定我要查找的状态,或者甚至创建一个isNotLoggedIn()函数,但是具有相同的逻辑但反转,我问,有没有办法否定对于canActivate的promise的决心的价值()?
解决方法
return!this.authService.isLoggedIn()将无效,因为JS的工作方式. this.authService.isLoggedIn()是promise对象并且是真实的. !this.authService.isLoggedIn()将始终为false.
相反,promise结果应映射到否定结果
canActivate() { return this.authService.isLoggedIn().then(result => !result); }
要么
async canActivate() { return !(await this.authService.isLoggedIn()); }
等待的括号……是可选的,用于可读性.