【问题标题】:How to throw the original error when using rxjs retryWhen with zero retries使用 rxjs retryWhen 零重试时如何抛出原始错误
【发布时间】:2018-08-18 01:00:38
【问题描述】:

我正在创建一个 Angular Http 重试拦截器。当我重试 1 次时,我的代码如下所示:

  return next.handle(req).pipe(
    retryWhen((error) => {
      return error.pipe(
        delay(1000),
        take(1),
        concatMap((err) => {
          return _throw({ ...err, message: `Sorry, there was an error (after 1 retry)` });
        })
      );
    })
  );

这似乎有效。我可以抛出原始错误。

现在,当重试次数为零时,这不起作用。我认为那是因为我们正在执行 take(0)。但是,concat 运算符将起作用:

  return next.handle(req).pipe(
    retryWhen((error) => {
      return error.pipe(
        delay(1000),
        take(0),
        concat(_throw({ message: `Sorry, there was an error (after 0 retries)` }))
      );
    })
  );

但问题是我无法得到原始错误。在我的零重试场景中,我可以使用哪些其他运算符来获取/抛出原始错误?

【问题讨论】:

标签: angular rxjs rxjs6


【解决方案1】:

感谢 paulpdaniels 的链接。这对我有用:

    return next.handle(req).pipe(
      retryWhen((error) => {
        return error.pipe(
          concatMap((e, i) => {
            if (i >= retries) {
              return throwError({ ...e, retries });
            }
            return of(e).pipe(tap(() => log.error(e)), delay(retryInterval as number));
          })
        );
      })
    );

我们不再使用 take 并且延迟在 concatMap 之内

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多