首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角2 RxJS可观测:重试,429状态除外

角2 RxJS可观测:重试,429状态除外
EN

Stack Overflow用户
提问于 2016-09-13 23:19:17
回答 1查看 6.9K关注 0票数 4

我编写了我的可观察到的(来自HTTP请求的),以便在失败时重新尝试。但是,如果服务器响应429 Too many requests错误,我不想重试。

无论发生什么,当前的实现都会重试两次,间隔1秒。

代码语言:javascript
复制
return this.http.get(url,options)
    .retryWhen(errors => {
        return errors.delay(1000).take(2);
    })
    .catch((res)=>this.handleError(res));

errors是可观察的。如何获得导致错误的底层Response对象?使用它,我可以访问服务器的状态代码,如果不是429,则只能重试:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-14 00:26:06

您可以将429个错误的处理组合到传递给retryWhen的可观察到的retryWhen中。从errors可观察到的错误将包含一个status属性,如果它们是从服务器接收到的错误。

如果您不想在发生429个错误时重试,而是希望抛出一个错误,您可以这样做:

代码语言:javascript
复制
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完成而不发出错误或响应,则只需过滤429个错误即可。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39480348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档