error-handling - 处理来自 Angular httpClient retryWhen 块的错误
问题描述
我有一个非常简单的 http 调用发生。出现错误时,我希望请求重试 3 次,重试之间有 3 秒的延迟。我已经制定了一个接近的解决方案:
return this.http.put<string>(URL,
value).retryWhen(err => {
return err
.delay(3000)
.take(3)
.concat(Observable.throw("error occurred"));
})
.catch(err => this.handleHttpError(err)) ;
客户端像我预期的那样重试了 3 次。但是,我不知道如何以我的错误处理程序(通常需要 HttpResponse 参数)可以处理错误的方式抛出最终错误。
一旦我采取了(3)我怎样才能得到最终的错误,并将其转换为 HttpResponse 发送给我的处理程序?还是我看错了?
归根结底,我需要知道伴随错误的 HttpResponse。当我在似乎无法完成的 concat 函数中从 retryWhen 抛出错误时。
我敢打赌这是一件很常见的事情,但是对于 Angular 5 的更新并做出反应,我认为我只是错过了这条船。
解决方案
您可以使用concatMap
来计算您尝试重新订阅的次数并根据该发送next
或error
通知(这意味着在进一步传播的内部 observable 中重新抛出错误)。
Observable.throw(42)
.retryWhen(err => err
.do(console.info) // remove, prints 42
.delay(3000)
.concatMap((error, index) => {
if (index === 2) {
return Observable.throw("error occurred"); // or Observable.throw(error);
}
return Observable.of(null);
})
)
// .catch(err => handleHttpError(err))
.subscribe(
v => console.log('next', v), // not called
e => console.log('error handler', e),
);
这将打印以下输出:
42
42
42
error handler: error occurred
推荐阅读
- javascript - 从异步函数中调用异步函数返回未定义
- c - 为什么我的程序在尝试将值存储在并行数组中时以“进程退出,值为 3221225477”而终止?
- scala - 如何指定传入类型参数的类具有某个伴生对象?
- amazon-web-services - 使用 AWS ECS 部署新的 docker 映像
- php - Evernote Api:如何获取与开发者帐户相关联的帐户备注列表
- python - 从一个烧瓶应用程序重定向到本地主机上的另一个烧瓶应用程序
- dart - 在类之间传递日期(变量)?
- python - 为什么我不能用这个图像创建一个 3 通道直方图?
- c# - 如果我在实体框架中全局禁用 ProxyCreation 会有什么后果?
- android - Android BillingClient 错误:“启动计费流程时出现异常:;对于 sku:android.test.purchased;尝试重新连接”