处理来自Angular httpClient的错误重试时阻止

时间:2018-05-14 18:34:15

标签: error-handling rxjs httpclient angular5

我有一个非常简单的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)) ;

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

一旦我采取了(3)我如何得到最终错误,并将其转换为HttpResponse发送给我的处理程序?或者我是以错误的方式看待这个?

在一天结束时,我需要知道伴随错误的HttpResponse。当我从重试中抛出错误时,在似乎没有完成它的concat函数中。

我认为这是一件很常见的事情,但是对于Angular 5来说更新一些并且我认为我只是错过了这条船。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

对于遇到此问题的任何人,我可以通过稍微更改返回来捕获httpErrorResponse:

首先我添加了一个本地var

let httpError: HttpErrorResponse = null;

然后我修改了回报:

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

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