我有两个端点:
其实我用:
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
, concatMap
和 exhaustMap
.每个人都有自己的目的。您可以找到它们之间的差异 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
, combineLatest
或 zip
并行触发 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/