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

Angular 2 RxJS Observable: Retry except on 429 status

我已经编写了我的 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));

errors 是一个 Observable。如何获取导致错误的基础 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 错误的处理组合到传递给 retryWhenerrors 可观察对象中。从 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 个错误。