RxJS- 有条件地使用 RetryWhen 运算符

RxJS- Conditionally using RetryWhen operator

我想为基于 Observable 的 Firebase 请求设计一个可扩展的错误处理策略。为此,我尝试为每种类型的错误创建一个自定义 RxJS 运算符(例如 unauthenticatedinternal,随便你怎么说)。运算符将在请求后堆叠如下:

FirebaseRequestObservable.pipe(
...
handleUnauthenticatedError(),
handleInternalError(),
handleYouNameItError(),
...
)

如果我的错误处理运算符仅由 catchError 运算符组成,则此方法工作正常,在这种情况下,其内部结构可以简单地为:

source.pipe(
catchError((err) => {
  if (err !== errorThisOperatorShouldHandle) {
   throw err 
   } 
  handleError
 }
))

如果错误不应由该操作员处理,则该错误会向下传递到下一个自定义操作员。

当我对某个错误的错误处理逻辑涉及使用 retryWhen 时,问题就来了。我不知道如何让操作员有条件地使用 retryWhen 如果它是正确的错误,如果不是,则将错误重新抛给下一个操作员。

如能就此问题提供任何帮助或对可扩展错误处理系统的不同策略提出建议,我们将不胜感激。谢谢!

它们非常相似。 下面是我可能如何实现这两个:

处理特定错误。

function handleYouNameItError<T>(): MonoTypeOperatorFunction<T> {

  return catchError(err => {
    if(err !== youNameItError){
      return throwError(() => err);
    }else{
      // handleError
      return EMPTY;
    }
  });

}

重试特定错误。

function retryYouNameItAnotherError<T>(): MonoTypeOperatorFunction<T> {

  return retryWhen(err$ => err$.pipe(
    tap(err => {
      if(err !== youNameItAnotherError){
        throw err;
      }
    }),
    // Delay 1s between retries
    delay(1000),
    // Only retry 5 times
    take(5),
    // After 5 retries, throw a new error
    concatWith(throwError(() => 
      new YouNameItAnotherErrorFailedAfterRetries()
    ))
  ));

}

将它们用作运算符:)

FirebaseRequestObservable.pipe(
  ...
  handleYouNameItError(),
  retryYouNameItAnotherError()
  ...
);