Angular 2 RxJS Observable:重试除了429状态

Bee*_*ice 2 observable typescript rxjs5 angular

我已经编写了我的Observable(来自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));
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得状态代码retryWhen

Plunker的现场演示

Angular 2 rc.6,RxJS 5 Beta 11,Typescript 2.0.2

car*_*ant 11

您可以将429个错误的处理组合到errors传递给它的observable中retryWhen.从errorsobservable 发出的错误将包含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));
Run Code Online (Sandbox Code Playgroud)

相反,如果您希望HTTP observable完成而不会发出错误或响应,则可以简单地过滤429错误.

  • 凉.我回来分享我的解决方案(我使用`switchMap`),但这也适用.http://plnkr.co/edit/iz9N8LzYIghwqqrstNEN?p=preview.谢谢Cartant (2认同)