在我的ANGLE应用程序中,我想对后端服务器进行一个HTTP调用.为了使其更具弹性,我添加了一个拦截器来实现重试模式.

我过go 常常利用RxJS的retryWhen操作符,但现在不推荐这样做,所以我这样做:

return next.handle(copiedRequest).pipe(
  retry({
    count: 5,
    delay: 1000,
  }),
  catchError((error: HttpErrorResponse) => {
    if (error.status === 0) {
      // Server not responding, so stuff
    }
    return throwError(() => error);
  })
);

问题是,这现在对我的所有HTTP响应状态都有效,而有时当服务器返回某个状态代码时,您知道重试没有意义.有没有办法向重试添加筛选器,以便它可以判断是否实际执行重试?

推荐答案

您想要的结果可以通过retry运算符的delay参数来实现:

next
  .handle(copiedRequest)
  .pipe(
    retry({
      count: 5,
      delay: (error: HttpErrorResponse, retryCount: number) => {
        // not using it for the demo you could also dynamically
        // change the behavior based on the retryCount param
        
        switch (error.status) {
          // retryable error status
          case 0:
          case 1:
            // retry
            return of(null);

          default:
            // for the rest, we just forward the original error
            return throwError(() => error);
        }
      },
    })
  )

这里有一个Stackblitz demo,您可以使用它,我还在其中构建了一些模拟,这样您就可以验证原始请求被重试了几次.

Cf Stackblitz上的控制台输出:

Request made: 0 // first one
Request made: 1 // second one
Request made: 2 // third one
An error was caught: Error: Some mocked error // received a non retryable error and forwarded it

Typescript相关问答推荐

无需刷新即可让现场访客逆变

为什么ESLint抱怨通用对象类型?

带有联合参数的静态大小数组

typescribe警告,explate—deps,useEffect依赖项列表

泛型函数即使没有提供类型

隐式键入脚本键映射使用

如何在TypeScript中将一个元组映射(转换)到另一个元组?

APIslice-CreateAPI的RTK打字错误

TS如何不立即将表达式转换为完全不可变?

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

如何合并两个泛型对象并获得完整的类型安全结果?

APP_INITIALIZER在继续到其他Provider 之前未解析promise

正确使用相交类型的打字集

为什么Typescript只在调用方提供显式泛型类型参数时推断此函数的返回类型?

为什么在泛型方法中解析此promise 时会出现类型错误?

我不明白使用打字脚本在模板中展开参考

在抽象类构造函数中获取子类型

TaskListProps[]类型不可分配给TaskListProps类型

如何将对象的字符串文字属性用作同一对象中的键类型

记录的子类型<;字符串,X>;没有索引签名