【问题标题】:Rxjs Repeat Until items to process is zeroRxjs 重复直到要处理的项目为零
【发布时间】:2021-09-11 19:50:59
【问题描述】:

我有一个端点,它接收一组 id 来进行一些处理。

后端开发人员要求我在高峰时段只发送 10 个 id,在高峰时段发送 50 个。

用户在一个字段中输入他们想要处理的所有 id(前 100 个)。

我需要做的是,首先,知道多少 ids 发送到后面,关于当前时间。

我之前没有对 id 进行分块,因为我想获取一些与前面提到的条件相关的 id,所以我试图重复整个 obs,直到没有要处理的 id。 还有一个挑战,就是每次之间必须有1分钟的延迟。

    concatMap(() =>
      of(null).pipe(
        map(() => this.isRushHour()),
        map(isRushHour => this.storeListToProccess.splice(0, isRushHour ? 10 : 50)),
        switchMap(p => this.createZones(p)),
        delayWhen(() => this.storeListToProccess.length ? interval(this.delayMs) : interval(0)),
        repeatWhen(()=> !!this.storeListToProccess.length)
      )
    )

有没有办法实现这一点,或者预分块 id 是唯一的方法吗?

【问题讨论】:

    标签: angular typescript rxjs rxjs-observables


    【解决方案1】:

    我会这样解决你的任务:

    from(this.storeListToProccess).pipe(
      bufferCount(this.isRushHour() ? 10 : 50), // here we chunkify the whole array into groups of 10 or 50 elements
      concatMap((p) => merge(this.createZones(p), timer(this.delayMs)))
      // concatMap () => timer will make sure that no new request will be send, untill timer is complete
    )
    

    基本上就是这样,如果您不需要处理请求结果。如果您确实需要处理它,则需要有关该问题的更多信息。

    【讨论】:

    • 我喜欢它,但是,我需要检查每个后端 Hit 之间的 rushHour。例如,我在 rushour 前一分钟发送 200 个 id:1)检查是否是 rushour ==> 返回 false 2)发送到后端块(50 个 id)3)解决后等待 1 分钟 4)重复 => In在这种情况下,rushhour 应该返回 true,因为一分钟后,它是 rushhour,所以在这种情况下,我应该只发送 10 个 id。
    【解决方案2】:

    我找到了一个解决方案,(实际上是两个)。我将使用 RXjs 发布一个:

    interval(1000)
      .pipe(
        takeWhile(()=> storeListToProccess.length>0),
        map(()=>storeListToProccess.splice(0, isRushHour() ? 1 : 2)),
        tap((IdsToSend)=> console.log(IdsToSend)),
        finalize(()=>console.log("Finished"))
      )
      .subscribe()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多