带有Angular 2的RxJS 5:重试失败,但可观察到,但随后出现转发错误

Bee*_*ice 2 observable typescript rxjs5 angular

当HTTP请求失败时,我想间隔1秒重试两次。如果它第三次再次失败,我想将该错误转发给观察者。我在最后一部分遇到了麻烦。

来自DataService.get()的 HTTP请求

return this.http.get(url,options)
    .retryWhen(errors => errors.delay(1000).take(2))
    .catch((res)=>this.handleError(res));
Run Code Online (Sandbox Code Playgroud)

订阅

this.dataSvc.get('/path').subscribe(
    res => console.log(res),
    err => console.error(err),
    () => console.log('Complete')
);
Run Code Online (Sandbox Code Playgroud)

我的服务器设置为始终返回错误(状态400 Bad request)。

  • 我希望应用程序发出第二个请求,发出第三个请求,然后抛出要捕获的错误 this.handleError()

  • 实际发生的情况:应用程序发出第二个请求,发出第三次请求,然后Observable完成而没有错误(将“ Complete ”打印到控制台)

Angular 2 rc.6RxJS 5 beta 11Typescript 2.0.2

Bee*_*ice 5

我用scan操作

return this.http.get(url,options)
    .retryWhen(errors => errors.delay(1000).scan((acc,source,index)=>{
        if(index) throw source;
    }))
    .catch((res)=>this.handleError(res));
Run Code Online (Sandbox Code Playgroud)

参数scan()

  • acc:一个累加器(请考虑Array.reduce())。如果您修改并返回它,则新值将acc在下一次执行时作为参数提供
  • source:前一个操作(delay()本身发出的值)发出的值(或异常errors
  • index:当前发出的值的索引(从零开始)

这发出3个HTTP请求(不知道为什么;我原本希望有2个)。在第3次失败时,它抛出source-发出的错误-被捕获handleError()