Error handling 处理来自httpClient retryWhen块的错误

Error handling 处理来自httpClient retryWhen块的错误,error-handling,rxjs,httpclient,angular5,Error Handling,Rxjs,Httpclient,Angular5,我有一个非常简单的http调用。出现错误时,我希望请求重试3次,两次重试之间有3秒的延迟。我已经找到了一个非常接近的解决方案: return this.http.put<string>(URL, value).retryWhen(err => { return err .delay(3000) .take(3)

我有一个非常简单的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函数中抛出retryWhen的err时,它似乎没有完成它

我打赌这是一件很平常的事,但由于比Angular 5和react更新,我想我只是错过了机会。

你可以使用concatMap计算你尝试重新订阅的次数,并根据该次数发送下一个或错误通知,这意味着在进一步传播的内部观察中重新抛出错误

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

请参阅现场演示:

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

 return error
          .do(err => {if (err instanceof HttpErrorResponse) {httpError = err; }})
          .delay(3000)
         .take(5)
         .concat(Observable.throw(error));
      })
首先,我添加了一个本地变量

let httpError: HttpErrorResponse = null;
然后我修改了报税表:

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

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

您不是已经在使用.catcherr=>this.handlehttperror执行此操作了吗?或者这个方法会返回什么?嗯,好吧。我捕捉到了错误,但我不知道如何从提供给retryWhen的err observative抛出HttpResponse。。抛出的是一个可观察到的错误,我相信。订阅是在Angular应用程序的不同部分处理的,并且它运行正常。我遇到的问题是在重试后获取伴随错误的httpResponse对象。我似乎无法从httpClient发送到retryWhen的err observable中找到这样做的方法。这有更好的意义吗?所以你想从retryWhen发送错误作为下一个或错误通知?我有同样的问题,你还在使用这个方法吗?我试过了,但得到了一个错误。do函数表示不可用