从AuthGuard中的Observable.catch重新抛出错误可以激活

时间:2017-05-20 14:54:09

标签: angular rxjs observable

我在AuthGuard的canActivate方法中有以下代码:

return this.http.get(url)
  .map(res => {
    console.log(res.json());
    return true;
  })
  .catch(error => {
    return Observable.throw(error);
    // return Observable.of(false);
  });

当我取消注释Observable.of(false)行时,一切都很顺利。但是,我不仅希望返回包含在Observable中的false,我还想重新抛出错误,以便我的全局自定义ErrorHandler能够捕获它并显示用户友好的消息。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

Observable.throw('error')
    .catch(error => {
        return Observable.throw(error).startWith(false);
    })
    .subscribe(
        value => console.log('Next', value),
        err => console.log('Error', err)
    );

catch()返回的Observable只是一个可以抛出错误的常规Observable。

请注意,您必须在subscribe()中设置错误回调,否则将重新抛出错误。

此演示打印以下输出:

Next: false
Error: error

答案 1 :(得分:0)

canActivateRouter.navigate 方法(以及其他方法)结合使用。这些方法都是通过Promise返回canActivate的结果,因此处理canActivate错误的方式是在Promise中处理。我发现在调用站点突出显示错误的最佳方法是使用 rxjs/throwError 作为 canActivate 的结果:

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    if (!someError) {
      throwError(`The raeson`)
    }
    return true;
  }

... 和导航承诺:

this.router.navigate([...segments]).catch(reason => {
  console.error(`Could not navigate ...: ${reason}`);
});

注意:导航期望 canActivate 返回一个完成的可观察对象(throwError 这样做,将错误暴露给承诺)。