我已经编写了 Observable(来自 HTTP 请求)以在失败时重试。不过,我想not如果服务器响应为重试429 Too many requests
error.
无论如何,当前的实现都会重试两次,间隔 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
?
Plunker 上的现场演示 http://plnkr.co/edit/iz9N8LzYIghwqqrstNEN?p=preview
Angular 2 rc.6
, RxJS 5 Beta 11
, Typescript 2.0.2
您可以将429错误的处理写成errors
可观察到的传递给retryWhen
。发出的错误errors
observable 将包含一个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 observable 完成而不发出错误或响应,则可以简单地过滤 429 错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)