angular - RxJS:Observable.never() 保持订阅状态
问题描述
我正在使用 rxjs 5.5.6。
我创建了此代码以显示行为:
Observable.of(1, 2)
.do(a => {
console.log(a);
let d:string = null;
let r = d.length; // it raises an null exception
})
.catch(() => {
console.log("error catched"); //exception is capture here
return Observable.never();
})
.subscribe();
我期待输出是:
1
error catched
2
error catched
但是,输出是:
1
error catched
这意味着,尽管在方法链Observable.never()
上返回了一个,订阅也会终止。.catch(...)
有任何想法吗?
真实案例
this.subs = Observable
.merge(this.$searchQuery, this.$lazyQuery)
.do(() => this.loadingPage())
.map(filter => this.buildURL(user, app, filter))
.switchMap(url => this.service.getItemsFromService(url))
.map(response => this.buildPage(response))
.do(page => this.loadedPage(page))
.catch(() => {
this.loadedPage(pojo.Page.EMPTY);
return Observable.never();
})
.takeUntil(this.$unsubscribe)
.subscribe();
解决方案
是的,@frido 的所有解释都是正确的。有了这个答案,我想补充一下:
如果您想捕获任何特定 Observable 本身发生的任何错误(例如 HTTP 请求),那么您需要在该特定错误 Observable 中处理它。
let correct = Observable.of("correct")
let inCorrect = Observable.throw('inCorect')
let obs = [inCorrect, correct];
let handledObs = obs.map(eachObs => {
return eachObs.catch((e) => {
console.log("Individual handler, Good Catch!");
return Observable.of("I am tampered");
})
})
forkJoin(...handledObs)
.do(a => {
console.log(a);
})
.catch(() => {
console.log("error catched");
return Observable.never();
})
.subscribe(data => {
console.log(`data`, data)
},(e) => {
console.log(`error`, e)
});
}
在此处查看示例:https ://stackblitz.com/edit/angular-7mmhn7?file=src/app/app.component.ts
编辑
但是,当我查看您的代码时,在我看来您正在尝试记录某些内容并且返回的数据可能没有length
属性,即使在这种情况下您想要继续处理流。如果这是真的,那么您可以在下面添加一个简单try
catch
的do()
from([1, 2])
.do(a => {
try {
console.log(a);
let d:string = null;
let r = d.length;
} catch(e) {
console.log(`catched under do`, e)
}
})
.catch(() => {
console.log("error catched");
return Observable.of('catched');
})
.subscribe(data => {
console.log(`data`, data)
},(e) => {
console.log(`error`, e)
});
这是一个示例:https ://stackblitz.com/edit/angular-bcrava?file=src/app/app.component.ts
推荐阅读
- android - 如何修复 ExoPlayer 错误“本机窗口无法处理受保护的缓冲区”
- javascript - 听 EACCES:权限被拒绝 0.0.0.0:8080
- python-3.x - 使用 title() 在 python 中创建一个额外的行
- c# - 如何在加载页面之前检查 Internet 连接?
- angular - 如何在剑道角网格内添加迷你图?
- sql - 数据库:相关字段包含多个值
- android - 单击时如何获取 Firestore RecyclerView 项目的文档 ID
- angular - 如何根据id取json键值
- r - 如何保存/加载通过 R 中的 h2o4gpu 库创建的随机森林模型?
- android - 如何在 Android 8.1 上访问 DCIM 文件夹