如何在 rxjs 中的订阅中重构订阅

Posted

技术标签:

【中文标题】如何在 rxjs 中的订阅中重构订阅【英文标题】:How to refactor a subscribe inside a subscribe in rxjs 【发布时间】:2018-10-01 18:03:08 【问题描述】:

例如:

this.saveSubscription$ = this.ds.onSave$.subscribe(x => 
  this.sb.updateMachineTool(this.viewEditModel.viewEditModel).subscribe(x = 
    console.log('alert results', x)
  )
)

this.ds.onSave$ 是在单击不同组件上的保存按钮时触发的主题。

this.sb.updateMachineTool 是更新特定工具的 httpClient 帖子

我应该使用某种类型的地图,这样我就不会同时订阅这两个区域了吗?

如何重构这段代码?

【问题讨论】:

【参考方案1】:

重构您的代码您可以使用mergeMapswitchMap

您的问题是switchMap 的完美用例。因为正如您所提到的,this.ds.onSave$ 是一个主题,当单击不同组件上的保存按钮时触发。switchMap 在这种情况下为您提供的优势是,如果重复单击该按钮,它将自动取消所有旧订阅(在您的情况下为 Http 调用中)。

修改代码

this.saveSubscription$ = this.ds.onSave$.pipe(switchMap(()=> 
  this.sb.updateMachineTool(this.viewEditModel.viewEditModel)
  )
).subscribe(x = 
    console.log('alert results', x)
  );

了解更多

    Understanding mergeMap and switchMap in RxJS The Simple Difference Between RxJS switchMap and mergeMap

【讨论】:

这太棒了,正是我所需要的。据我了解,mergemap 中的内容会自行完成,我仍然需要取消订阅 this.saveSubscription$ 对吗? @ghoul Mate MergeMap 允许同时激活多个内部订阅,这在您的情况下是不可取的,除了取消订阅被认为是一种好的做法。 对不起,我的意思是switchMap @ghoul ***.com/questions/35042929/… 看看

以上是关于如何在 rxjs 中的订阅中重构订阅的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RxJS 订阅方法中等待

如何在 Angular 和 RxJs 中管理多个顺序订阅方法?

如何在没有嵌套订阅的情况下使用 rxjs 处理内部订阅数组

Rxjs 如何知道 observable 有多少订阅者?

在使用带有 Angular 的 FromEvent RxJS 订阅输入标签值更改时如何避免使用“任何”?

如何取消订阅角度组件中的多个可观察对象?