【问题标题】:RxJS prevent switchMap to send request in first placeRxJS 阻止 switchMap 首先发送请求
【发布时间】:2019-06-22 08:10:47
【问题描述】:

我有一个组件订阅了一个同时触发多次的事件。此订阅向服务器发起请求以获取数据。我想要实现的是只触发一个请求。

相反,在最终请求完成之前,我会收到大量已取消的请求:

更新:

this.someObject.onEvent()
  .pipe(switchMap((filterCriterias) => this.loadData(filterCriterias)))
  .subscribe((res) => {
    this.data = res;
});

有没有办法创建一个集水池,只触发最后一个请求,如图所示(首先不会收到取消的请求)?

我正在使用 RxJs 6.3

提前致谢!

【问题讨论】:

  • 是否所有四个请求都包含相同的数据,如果第一个请求完成而其他所有请求都消失了可以吗?
  • 很遗憾没有。我正在处理竞争条件问题,前两个请求没有数据,只有最后一个有..
  • 这就是我使用 switchMap 的原因,但取消的请求有些烦人。
  • 那你只能改进你的loadData()方法,检查它是否有一些有效的数据,只有在这种情况下才真正发出http请求。否则它应该返回empty()
  • 有关映射运算符的更多信息可以在以下位置找到:blog.angular-university.io/rxjs-higher-order-mapping

标签: angular typescript rxjs rxjs6


【解决方案1】:

您似乎可以使用exhaustMap 而不是switchMap

exhaustMap 将忽略所有后续发射,直到内部 Observable 完成。所以即使onEvent() 发出五次,也只有第一次会触发this.loadData()。在活动的this.loadData() 完成之前,所有其他发射都将被忽略。

this.someObject.onEvent()
  .pipe(
    exhaustMap(() => this.loadData())
  )
  .subscribe((res) => ...);

【讨论】:

  • exhaustMap 的问题是,如果一个没有请求所需数据的发射提前发射,那么我没有收到请求的响应。
  • 好吧,我想您应该过滤掉不应触发任何请求的排放...
  • 如果响应是可缓存的,为什么不缓存它以供后续请求使用?
【解决方案2】:
this.someObject.onEvent()
  .pipe(debounceTime(300),switchMap(() => this.loadData()))
  .subscribe((res) => {
    this.data = res;
}); 

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2022-01-21
    • 2020-10-30
    • 2013-06-06
    相关资源
    最近更新 更多