angular - 如果满足特定条件,RXJS 停止 Observable 链的传播

标签 angular rxjs observable angular-observable angular-router-guards

简介

我正在尝试使用共享服务中的 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/

相关文章:

javascript - Angular2事件: keyup exits input

Angular/ Material 垫日期选择器未显示在正确的位置

javascript - 上一个成功完成后,如何对 api 进行新调用?

javascript - 运算符管道是否创建类似于过滤器、映射、减少创建中间数组的中间可观察对象?

javascript - 完成后 n 秒重复请求(Angular2 - http.get)

angular - 当我点击 ionic 图标时, ionic 卡中的方法也会被触发

angular - 子组件中的 ExpressionChangedAfterItHasBeenCheckedError

javascript - RxJS - 初始状态和更新

angular - 设置新值时,FormControl 的 valueChanges 不会触发

Angular 2 Observable Service 从 localStorage 返回数据