带角度2的RxJS 5:重试失败Observable但后转错误

时间:2016-09-13 08:44:06

标签: angular typescript observable rxjs5

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

来自 DataService.get()

的HTTP请求
return this.http.get(url,options)
    .retryWhen(errors => errors.delay(1000).take(2))
    .catch((res)=>this.handleError(res));

订阅

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

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

  • 我希望应用程序发出第2个请求,发出第3个请求,然后抛出错误以便this.handleError()

  • 抓住
  • 实际发生了什么:应用程序发出第2个请求,成为第3个,然后Observable完成且没有错误(“完成”打印到控制台)

Angular 2 rc.6RxJS 5 beta 11Typescript 2.0.2

1 个答案:

答案 0 :(得分:4)

我使用the scan operator

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

scan()的参数:

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

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

捕获