在守卫中否定承诺的结果

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