在守卫中否定承诺的结果
Negating the result of a promise in a guard
我有一个带有 canActivate()
的工作 angular2 守卫,它为 isLoggedIn()
和 returns 调用一个服务,然后解析并适当地处理路由。
但是,我正在尝试做相反的事情,查看用户何时未登录,并且它不起作用。
我尝试了像这样简单的方法(添加一个 ! 运算符),希望它能起作用:
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService) {}
canActivate() {
return !this.authService.isLoggedIn();
}
}
但是,这总是 returns 一个错误的值并且路由永远不会激活。
这是我的 isLoggedIn()
函数的相关摘录:
isLoggedIn(): Promise<Boolean> {
var component = this;
return new Promise((resolve, reject) => {
component.queryForUser((user) => {
resolve(user != null);
});
}
});
}
如果用户不等于 null
,则他已登录并且 promise 解析为 true。否则,假的。
虽然我可以简单地添加一个参数来指定我正在寻找的状态,或者甚至创建一个 isNotLoggedIn()
函数,但逻辑相同但相反,我问,有没有办法取反该值canActivate()
?
承诺的决心
您需要做的就是进一步操纵承诺的解析值:
canActivate() {
return this.authService.isLoggedIn().then(loggedIn => !loggedIn);
}
return !this.authService.isLoggedIn()
将不起作用,因为 JS 的工作方式。 this.authService.isLoggedIn()
是 promise 对象并且是真实的。 !this.authService.isLoggedIn()
永远是假的。
相反,承诺结果应映射到否定结果
canActivate() {
return this.authService.isLoggedIn().then(result => !result);
}
或
async canActivate() {
return !(await this.authService.isLoggedIn());
}
await ...
两边的括号是可选的,用于提高可读性。
如果您在 if 语句中并且启用了 async/await,请将否定移动到括号内。
if (!await client.bucketExists('test')) {}
我有一个带有 canActivate()
的工作 angular2 守卫,它为 isLoggedIn()
和 returns 调用一个服务,然后解析并适当地处理路由。
但是,我正在尝试做相反的事情,查看用户何时未登录,并且它不起作用。
我尝试了像这样简单的方法(添加一个 ! 运算符),希望它能起作用:
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService) {}
canActivate() {
return !this.authService.isLoggedIn();
}
}
但是,这总是 returns 一个错误的值并且路由永远不会激活。
这是我的 isLoggedIn()
函数的相关摘录:
isLoggedIn(): Promise<Boolean> {
var component = this;
return new Promise((resolve, reject) => {
component.queryForUser((user) => {
resolve(user != null);
});
}
});
}
如果用户不等于 null
,则他已登录并且 promise 解析为 true。否则,假的。
虽然我可以简单地添加一个参数来指定我正在寻找的状态,或者甚至创建一个 isNotLoggedIn()
函数,但逻辑相同但相反,我问,有没有办法取反该值canActivate()
?
您需要做的就是进一步操纵承诺的解析值:
canActivate() {
return this.authService.isLoggedIn().then(loggedIn => !loggedIn);
}
return !this.authService.isLoggedIn()
将不起作用,因为 JS 的工作方式。 this.authService.isLoggedIn()
是 promise 对象并且是真实的。 !this.authService.isLoggedIn()
永远是假的。
相反,承诺结果应映射到否定结果
canActivate() {
return this.authService.isLoggedIn().then(result => !result);
}
或
async canActivate() {
return !(await this.authService.isLoggedIn());
}
await ...
两边的括号是可选的,用于提高可读性。
如果您在 if 语句中并且启用了 async/await,请将否定移动到括号内。
if (!await client.bucketExists('test')) {}