【发布时间】:2026-02-05 08:35:01
【问题描述】:
我已经编写了我的 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 中获取状态码?
Angular 2 rc.6、RxJS 5 Beta 11、Typescript 2.0.2
【问题讨论】:
-
如果因为从服务器接收到错误而引发错误,则错误实例应包含
status和statusText属性。 -
@cartant 是的,但我如何获得这个实例?如果我删除
retryWhen,则实例将作为Response类的对象传递给上面的handleError()。但我不知道如何在retryWhen逻辑期间阅读它。正如我在 OP 中提到的,该函数接收的(上面称为errors)是 Observable,而不是带有status和statusText属性的 httpResponse。 -
我希望可观察到的错误(这是服务器错误的结果)中的任何错误实例都包含
status和statusText属性。我不熟悉retryWhen运算符 - 因此是评论 - 但您应该能够从错误本身中获取status。 -
status和statusText属性在 HTTP 客户端的 error-handling 示例中被提及/暗示。 -
@cartant 请注意,这些内容在错误处理函数中可用。但是
retryWhen在不同的上下文中执行。让我把一个plunker放在一起,这样我们就可以具体了。
标签: angular typescript observable rxjs5