我已经编写了我的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.6RxJS 5 Beta 11Typescript 2.0.2

最佳答案

您可以将429个错误的处理组合到传递给errorsretryWhen可观测数据中。从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个错误。

09-16 14:30