我在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
能够捕获它并显示用户友好的消息。
答案 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)
canActivate
与 Router.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 这样做,将错误暴露给承诺)。