否定守卫的承诺结果

时间:2017-04-05 23:08:58

标签: angular typescript promise angular2-routing

我有一个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()的决心?

3 个答案:

答案 0 :(得分:7)

由于JS的工作方式,

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')) {}