angular - 避免在 Angular 2+ 中嵌套订阅?

标签 angular rxjs

我有两个端点:

  • 1 个端点来获取当前用户的登录信息。
  • 1 个端点来获得此用户的授权。

  • 其实我用:
    this.user
      .subscribe((e) => {
         this.grants.get(e)
            .subscribe((x) => {
                console.log(x)
             })
      })
    
    但这是 Angular 2+/RxJS 的反模式。
    我想知道如何按照 Angular/RxJS 最佳实践执行此操作。
    谢谢

    最佳答案

    避免嵌套订阅取决于可观察对象的性质以及它们如何相互依赖:
    相互依赖的可观察量
    当一个 observable ( this.grants.get() ) 依赖于另一个 observable ( this.user ) 的通知时,您可以使用任何 RxJS 高阶映射运算符 switchMap , mergeMap , concatMapexhaustMap .每个人都有自己的目的。您可以找到它们之间的差异 here .
    与他们相关的简短差异

  • switchMap - 如果外部可观察对象发出
  • ,则取消内部可观察对象
  • mergeMap - 为每个外部通知触发内部 observable(扁平化外部通知)
  • concatMap - 本质上 mergeMap随时有单个并发请求(扁平化外部通知但按顺序发出它们)
  • exhaustMap - 如果内部 observable 尚未完成,则忽略外部通知

  • 插图使用 switchMap运算符(operator)
    this.user.pipe(
      switchMap(e => this.grants.get(e))
    ).subscribe((x) => {
      console.log(x)
    });
    
    独立观察
    如果 observables 相互独立,你可以使用 RxJS 函数,如 forkJoin , combineLatestzip并行触发 observables。
    与他们相关的简短差异
  • forkJoin α - 仅当所有 observables 完成时才发出
  • combineLatest α,β - 发射时 任何 的 observables 发出(没有排放的 observables 将发出旧值)
  • zip α,β - 发射时 全部 的 observables 发出

  • 插图使用 forkJoin
    forkJoin(this.obs1, this.obs2, ...).subscribe(
      res => console.log(res)
    );
    
    α - 从每个 observable 发出一组通知(例如, (this.obs1, this.obs2, ...) 将发出 ['res from obs1', 'res from obs2', ...] )。
    β - 所有可观察的 应该至少发出一次供运算符(operator)发出

    关于angular - 避免在 Angular 2+ 中嵌套订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63685936/

    相关文章:

    angular - 如何在服务模拟中测试可观察的更改?

    angular - 捕获错误后如何忽略错误并在rxjs forkJoin中执行最终结果?

    angular - 在 ngOnInit 中测试一个可观察的间隔

    Angular 7 - 检测到循环依赖项中的警告 :

    angular - 如何以编程方式从数据表中扩展行

    未调用 Angular 4 Component @Input ngOnInit

    javascript - forEach 运算符在没有订阅的情况下被评估

    angular - FormControl.detectchanges - 为什么使用 distinctUntilChanged?

    javascript - 由于错误,RxJs 订阅在一个 flatMap 后下降

    angular - Bootstrap 4 不适用于 Angular 2 应用程序