小编kar*_*ari的帖子

RxJS 轮询+使用退避策略重试

我一直在尝试实现我自己的 RxJS 运算符,以便我可以将其“插入”到我的 Angular 的 HttpClient。我想让请求每 X 毫秒持续一次(轮询),但如果出现错误,我想使用某种增量策略重试请求。这是一个细分:

  1. 每 X 毫秒一次又一次重复请求(轮询)
  2. 如果出现错误,请求应每 Y 毫秒重试一次,但如果请求再次失败,则毫秒数应加倍(例如,第一次失败 1000 毫秒,第二次 2000 毫秒,第三次 4000 毫秒),直到达到限制,例如1 分钟,则重试次数不会再次增加,所有后续重试都应等待 1 分钟。
  3. 重试成功后,重试毫秒计数器应重新启动,以便下次从Y毫秒开始重试。
  4. 当执行一个无论出于何种原因需要花费大量时间来响应的请求时,我们需要确保没有其他请求被触发或取消(我可以在这里看到 concatMap 的可能用途!)

这是我到目前为止所拥有的:

function repeatWithBackoff<T>(delay: number, maxDelay = 60000) {
  return (source: Observable<T>) =>
    timer(0, delay).pipe(
      concatMap(() => {
        return source.pipe(
          retryWhen((attempts) => {
            return attempts.pipe(
              concatMap((attempt, i) => {
                const backoffDelay = Math.min(delay * Math.pow(2, i), maxDelay);
                return timer(backoffDelay);
              })
            );
          })
        );
      })
    );
}
Run Code Online (Sandbox Code Playgroud)

我的使用方法如下:

httpClient.post(...)
  .pipe(repeatWithBackoff(1000, 60000))
  .subscribe((x) => console.log('Result', x)); …
Run Code Online (Sandbox Code Playgroud)

observable rxjs angular

6
推荐指数
1
解决办法
193
查看次数

标签 统计

angular ×1

observable ×1

rxjs ×1