【问题标题】:How to throttle a forkJoin Angular 5如何节流 forkJoin Angular 5
【发布时间】:2018-09-25 11:31:28
【问题描述】:

在我的组件中,我将一组需要执行的操作组合在一起。它们执行的顺序并不重要,但如果成功,我想在最后显示。每个操作都会导致对 WebAPI 的调用。 (我很欣赏如果在一次调用中传递操作会好多更好,但这不是一种选择。

不幸的是,调用次数太多了,它实际上是在对 API 进行 DOS 处理。我试图进行管道延迟,但也许我没有把它放在正确的地方

const results: any[] = [];
this.bigArray.forEach(item =>
  results.push(
    this.aServiceWhichWillCallAPostMethod.doAnUpdate(item)
  )
);

forkJoin(results).subscribe(
  data => {
    Console.log('Yeah');
  },
  error => {
    Console.log('Oops');
  },
  () => {
  }
);

我已经尝试在这里添加延迟

this.aServiceWhichWillCallAPostMethod.doAnUpdate(item).pipe(delay(5000))

这里

forkJoin(results).subscribe

但没有运气

【问题讨论】:

  • 我看到了那个帖子,你可以看到我尝试使用 pipe.delay
  • 您要等待上一个 observable 解决后再进行下一个调用吗?
  • 我不需要,但如果它停止了 DOS,那么它可能是解决问题的方法
  • 那不如使用 concatMap。 concatMap 不需要 observable 数组,它也使用“Concat”策略——(排队每个新的 Observable,只有在最后一个 observable 完成时才订阅新的 observable。)

标签: angular rxjs angular2-observables


【解决方案1】:

最简单的方法是尝试重写代码以使用mergeMap 而不是forkJoin。 .mergeMap() 原生支持限制调用 observables 的并发性。

Rx.Observable.from(this.bigArray).mergeMap(
  item => this.aServiceWhichWillCallAPostMethod.doAnUpdate(item), */ project */
  undefined, /* resultselector */
  5 /* concurrency */
)
.subscribe();

这样您最多可以处理 5 个项目(不保留订单,merge 策略)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2020-10-02
相关资源
最近更新 更多