【发布时间】:2019-03-21 13:28:07
【问题描述】:
简介
我正在尝试使用共享服务中的 Observable 在 Angular2+ 中创建路由保护,该共享服务包含当前用户角色的字符串值。
问题显然在于将我的想法从 Promise 转移到 Observables。
到目前为止,我所做的是基于启发式和尝试错误的方法,但是 我通过杀死浏览器撞墙感谢danday74解决
.
尝试(感谢@danday74 改进)
在RxJS sequence equvalent to promise.then()? 的帮助下,我将我想做的事情翻译成这个链:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> | boolean {
return this.auth.isRoleAuthenticated(route.data.roles)
.mergeMap((isRoleAuthenticated: boolean) => {
return isRoleAuthenticated ? Observable.of(true) : this.auth.isRole(Roles.DEFAULT_USER);
})
.do((isDefaultUser: boolean) => {
const redirectUrl: string = isDefaultUser ? 'SOMEWHERE' : 'SOMEWHERE_ELSE';
this.router.navigate([redirectUrl]);
})
.map((isDefaultUser: boolean) => {
return false;
});
}
问题
如果isRoleAuthenticated = true,如何阻止可观察链的进一步传播?如果满足此类条件,我需要返回该布尔值,并确保之后不调用 .do 运算符块。
限制是必须从canActivateguard 返回布尔值。
【问题讨论】:
-
浏览器实际上只是永远加载而不是崩溃,抱歉表达不好。尝试使用
setTimeout()和take(1),我仍然无法调试并且浏览器永远加载,直到页面变得无响应。
标签: angular rxjs observable angular-observable angular-router-guards