当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.6
,RxJS 5 beta 11
,Typescript 2.0.2
答案 0 :(得分:4)
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()