我有一个canActivate()
工作的angular2守卫调用isLoggedIn()
的服务并返回一个承诺然后解析并且路线被适当地处理。
但是,我正在尝试相反,查看用户何时未登录,并且无法正常工作。
我尝试了一些简单的事情(添加一个!运算符),希望它可以工作:
@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()
的决心?
答案 0 :(得分:7)
return !this.authService.isLoggedIn()
无效。 this.authService.isLoggedIn()
是承诺对象并且是真实的。 !this.authService.isLoggedIn()
永远都是假的。
相反,应使用
将promise结果映射到否定结果canActivate() {
return this.authService.isLoggedIn().then(result => !result);
}
或者
async canActivate() {
return !(await this.authService.isLoggedIn());
}
await ...
周围的括号是可选的,用于提高可读性。
答案 1 :(得分:3)
您需要做的就是进一步操纵承诺的已解决价值:
canActivate() {
return this.authService.isLoggedIn().then(loggedIn => !loggedIn);
}
答案 2 :(得分:1)
如果您在if语句中,并且启用了异步/等待,请在括号内移动否定符。
if (!await client.bucketExists('test')) {}