简介
我正在尝试使用共享服务中的 Observable 在 Angular2+
中创建一个路由守卫,该共享服务保存当前用户 Angular 色的字符串值。
问题显然在于将我的想法从 Promises 转移到 Observables。
What I made so far is based on heuristics and try & error approach but I hit the wall by killing the browser Solved thanks to 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
,如何停止可观察链的进一步传播?如果满足这样的条件,我需要返回该 bool 值,并确保 .do
运算符 block 不会在之后被调用。
限制是必须从 canActivate
守卫返回 bool 值。
最佳答案
do()
运算符仅适用于 next
通知,因此如果您不想处理 .mergeMap
之后的内容,您可以使用 filter()
过滤掉它:
return this.auth.isRoleAuthenticated(route.data.roles)
.mergeMap((isRoleAuthenticated: boolean) => {
return isRoleAuthenticated ? Observable.of(true) : this.auth.isRole(Roles.DEFAULT_USER);
})
.filter(authenticated => authenticated !== true)
但是,看起来您可以只返回 Observable.empty()
而不是 Observable.of(true)
因为那样只会发出 complete
通知并且没有 next
项,因此不会有任何内容传递给 do()
:
.mergeMap((isRoleAuthenticated: boolean) => {
return isRoleAuthenticated ? Observable.empty() : this.auth.isRole(Roles.DEFAULT_USER);
})
关于angular - 如果满足特定条件,RXJS 停止 Observable 链的传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52845192/