我已经编写了我的observate(来自http请求)以在失败时重试。但是,如果服务器以429 Too many requests
错误响应,我不想重试。
目前的实现重试两次,1秒分开,无论什么。
return this.http.get(url,options)
.retryWhen(errors => {
return errors.delay(1000).take(2);
})
.catch((res)=>this.handleError(res));
errors
是可观测到的。如何获取导致错误的基础Response
对象?有了它,我可以访问服务器的状态代码,只有在不是429时才能重试:return this.http.get(url,options)
.retryWhen(errors => {
if($code == 429) throw errors;
else return errors.delay(1000).take(2);
})
.catch((res)=>this.handleError(res));
如何在
retryWhen
中获取状态代码?Live demo on Plunker
Angular 2 rc.6
,RxJS 5 Beta 11
,Typescript 2.0.2
最佳答案
您可以将429个错误的处理组合到传递给errors
的retryWhen
可观测数据中。从errors
可观测值发出的错误如果是从服务器接收到的错误,则包含status
属性。
如果您不想在发生429个错误时重试,而是希望抛出错误,则可以执行以下操作:
return this.http.get(url,options)
.retryWhen((errors) => {
return errors
.mergeMap((error) => (error.status === 429) ? Observable.throw(error) : Observable.of(error))
.delay(1000)
.take(2);
})
.catch((res) => this.handleError(res));
相反,如果您希望http observate在不发出错误或响应的情况下完成,那么您可以简单地过滤429个错误。