javascript - 等待可观察的订阅 Angelar2

标签 javascript angular observable angular-http

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

我需要返回 true 或 false,但由于我进行了异步调用,我无法根据我的响应返回。 我意识到我不能等待,因为它是单线程的,但我需要以某种方式阻塞,直到我从 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,而不仅仅是一个 bool 值。 这意味着您的代码可以像这样重写。

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 等待可观察对象解析,然后再决定是否可以显示路线。 请注意,此方法应该非常快,以避免加载缓慢。

关于javascript - 等待可观察的订阅 Angelar2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39947081/

相关文章:

javascript - 如何用 MatdialogRef 显示对话框?

Angular - 子组件可以引用父组件的模板变量吗?

Angular 2 + RxJS : async pipe with . share() 运算符

typescript - RxJS 5 可观察到的 : does any result belong to a known set

angular - 没有可观察对象的服务

JavaScript 在使用 jQuery ui 自动完成的 Firefox 中失败

javascript - JQuery 可拖动元素在 droppable.append(draggable) 上消失在 droppable 中

javascript - 服务器数据请求后无法更新旋钮的颜色

javascript - 使用 setTimeout 缓出

angular - 是否可以将服务注入(inject)到子组件中?