angular - 在 Observable.interval() 中捕获 http 错误
问题描述
我有一块每小时运行一次到给定网址的块。基本上,现在如果找不到 url 或通常以错误 500 响应,我会收到错误消息。该应用程序使用服务工作者,但如果提供的 url 存在(404/500 触发以下消息),则可以正常工作:
Failed to load resource: net::ERR_INVALID_RESPONSE
ERROR Error: Uncaught (in promise): TypeError: Failed to register a ServiceWorker: An unknown error occurred when fetching the script.
TypeError: Failed to register a ServiceWorker: An unknown error occurred when fetching the script.
at resolvePromise (zone.js:831)
at eval (zone.js:741)
at eval (zone.js:757)
at ZoneDelegate.invoke (zone.js:391)
at Object.onInvoke (core.js:4760)
at ZoneDelegate.invoke (zone.js:390)
at Zone.run (zone.js:150)
at eval (zone.js:889)
at ZoneDelegate.invokeTask (zone.js:423)
at Object.onInvokeTask (core.js:4751)
在我的控制台中。我怎样才能优雅地捕捉到错误?
Observable.interval(3000)
.subscribe((data) => {
this.http.get('http://localhost:87887/profile/1/') // doesnt exist
.subscribe((data) => {
this.pingStream.next(true);
},
err => {
if (err.status == 500){
this.pingStream.next(false);
}
else{
this.pingStream.next(true);
}
}
);
});
解决方案
如果您希望链在出现错误后继续运行,那么interval(3000)
您必须将其放入catchError
内部concatMap
(或者mergeMap
也可以正常工作)。然后,这取决于发生错误时您想要做什么。您可以通过返回EMPTY
或将其转换为next
通知来忽略它:
import { EMPTY } from 'rxjs';
...
// Assuming you're using RxJS 6
interval(3000).pipe(
concatMap(() => this.http.get('http://localhost:87887/profile/1/').pipe(
catchError(error => {
if (err.status == 500){
this.pingStream.next(false);
} else {
this.pingStream.next(true);
}
return EMPTY;
})
))
).subscribe(data => this.pingStream.next(true));
推荐阅读
- python - 使用 google-cloud-bigquery 客户端库 (Python) 从 BigQuery 读取时发生 ArrowIOError
- oracle - 从脚本创建 Oracle DDL 对象时出错:“无效的普通用户或角色名称”、“文件已经是数据库的一部分”等
- spring - 如何在 r2dbc-postgresql 中使用 EnumCodec
- reactjs - React Native 删除 Flatlist 中的底部空间
- python - Scipy 差分进化初始解输入
- electron - 最小化后电子高度变化,恢复
- python - 或者当使用 Python 存在 NaN 值时逻辑不起作用
- youtube-api - 为什么 YouTube Data API 搜索经常会找到 0 个结果,而普通的 YouTube 网站搜索会产生很多结果?
- android - 错误:在 FirebaseMessagingService 上注入时无法访问 RemoteMessage
- oracle-sqldeveloper - 根据表 1 中字符串内容的条件连接两个表