error-handling - Angular httpClient retryWhen block 处理错误

标签 error-handling rxjs httpclient angular5

我正在发生一个非常简单的http调用。出现错误时,我希望请求重试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来计算尝试重新订阅的次数,并根据该次数发送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

关于error-handling - Angular httpClient retryWhen block 处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50336867/

相关文章:

多进程上的 Python sys.excepthook

java - 捕获错误(而不是异常)有什么意义,因为程序不会由 JVM 启动

ios - Xcode- swift 2.0 : "Extra argument ' error' in call"with NSJSONSerialization

javascript - RxJS:一个将自己的旧值作为输入的 Observable

swift - 在Swift中引发验证运行时错误的单元测试

javascript - 如何让 redux store 表现得像一个可观察的?

javascript - RxJS - 检测长鼠标按下

android - 在 Android 上使用 HTTPClient 进行多个 HTTP 连接的最佳方式

c# - 创建新的 HttpClient 时无法加载 DLL 'System.Security.Cryptography.Native.OpenSsl'

java - 如何从 header 获取最后修改日期到字符串