等待可观察对象订阅Angelar2

Await on observable subscription Angelar2

本文关键字:Angelar2 对象 观察 等待      更新时间:2023-09-26

在我的Angular2应用程序中,我使用canActivate来允许访问页面。其中一部分是与服务器检查令牌是否被篡改,因此在我可以决定是否可以授予用户访问权限之前,我需要调用我的api。这意味着订阅一个可观察对象并等待答案。

我需要返回true或false,但是因为我做了一个asyns调用,我不能根据我的响应返回。我意识到我不能等待,因为它是单线程的,但我需要以某种方式阻塞,直到我从api得到答案。我的canActivate如下所示:

canActivate() {
   this.guardClient.checkToken("token")
  .subscribe(response => {
    let responseText = response.text().replace(/"/g, '');
    if ( responseText === 'Ok')
    {
      return true;
    }
    if(responseText === 'denied') {
      this.router.navigate(['login']); // redirecting to login
      return false;
    }
  });
}
谁能告诉我怎么解决这个问题?

当查看angular 2中的CanActivate界面时,我看到了以下内容:

export interface CanActivate {
    canActivate(route: ActivatedRouteSnapshot, state:     RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean;
}

正如你所看到的,你也可以返回一个Observable,而不仅仅是一个布尔值。这意味着你的代码可以像这样重写。

canActivate() {
 return this.guardClient.checkToken("token")
   .map(response => {
     let responseText = response.text().replace(/"/g, '');
     if ( responseText === '  Ok')
      {
       return true;
      }
     if(responseText === 'denied') {
        this.router.navigate(['login']); // redirecting to login
        return false;
   }
 });
}

这会让Angular等待可观察对象解析完毕,然后再决定该路由是否可以显示。注意,这个方法应该非常快,以避免加载缓慢。