【问题标题】:handling error from Angular httpClient retryWhen block处理来自 Angular httpClient retryWhen 块的错误
【发布时间】:2018-05-14 18:34:14
【问题描述】:

我有一个非常简单的 http 调用发生。出现错误时,我希望请求重试 3 次,重试之间有 3 秒的延迟。我已经制定了一个接近的解决方案:

return this.http.put<string>(URL,
               value).retryWhen(err => {
                    return err
                    .delay(3000)
                    .take(3)
                    .concat(Observable.throw("error occurred"));
                })
               .catch(err => this.handleHttpError(err)) ;

客户端像我预期的那样重试了 3 次。但是,我不知道如何以我的错误处理程序(通常需要 HttpResponse 参数)可以处理错误的方式抛出最终错误。

一旦我采取了(3),我怎样才能得到最终的错误,并将其转换为 HttpResponse 以发送给我的处理程序?还是我看错了?

归根结底,我需要知道伴随错误的 HttpResponse。当我在似乎无法完成的 concat 函数中从 retryWhen 抛出错误时。

我打赌这是一件很常见的事情,但是对于 Angular 5 的更新和反应,我想我只是错过了这条船。

【问题讨论】:

  • 你不是已经用.catch(err =&gt; this.handleHttpError(err)) 做这个了吗?或者这个方法返回什么?
  • 嗯。好松散。我发现了错误,但我不知道如何从提供给 retryWhen() 的 err Observable 中抛出 HttpResponse .. 我相信抛出的是 err 的 observable。

标签: error-handling rxjs httpclient angular5


【解决方案1】:

您可以使用concatMap 来计算您尝试重新订阅的次数,并据此发送nexterror 通知(这意味着在进一步传播的内部可观察对象中重新抛出错误) .

Observable.throw(42)
  .retryWhen(err => err
    .do(console.info) // remove, prints 42
    .delay(3000)
    .concatMap((error, index) => {
      if (index === 2) {
        return Observable.throw("error occurred"); // or Observable.throw(error);
      }
      return Observable.of(null);
    })
  )
  // .catch(err => handleHttpError(err))
  .subscribe(
    v => console.log('next', v), // not called
    e => console.log('error handler', e),
  );

这将打印以下输出:

42
42
42
error handler: error occurred

观看现场演示:https://stackblitz.com/edit/rxjs5-jt5ald

【讨论】:

  • 订阅在 Angular 应用程序的不同部分处理,并且运行正常。我遇到的问题是在重试后获取伴随错误的 httpResponse 对象。我似乎无法从从 httpClient 发送到 retryWhen 的 err observable 中找到一种方法。这更有意义吗?
  • 所以您想将来自retryWhen 的错误作为nexterror 通知发送?
【解决方案2】:

对于遇到这种情况的任何人,我都可以通过稍微更改返回来捕获 httpErrorResponse:

首先我添加了一个本地变量

let httpError: HttpErrorResponse = null;

然后我修改了返回:

 return error
          .do(err => {if (err instanceof HttpErrorResponse) {httpError = err; }})
          .delay(3000)
         .take(5)
         .concat(Observable.throw(error));
      })

这允许我缓存最后一个 http 错误响应。然后我在捕获中寻找这个并相应地工作。似乎工作得很好。

【讨论】:

  • 我也遇到了同样的问题,你还在用这个方法吗?我试过了,但 .do 函数出现错误(说不可用)
猜你喜欢
  • 2018-06-26
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2010-11-11
相关资源
最近更新 更多