首页 > 解决方案 > 处理来自 Angular httpClient retryWhen 块的错误

问题描述

我有一个非常简单的 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 的更新并做出反应,我认为我只是错过了这条船。

标签: error-handlingrxjshttpclientangular5

解决方案


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

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


推荐阅读