angular - 错误后角度停止监听 EventEmitter
问题描述
我有一个合并监听几个事件并从服务中检索数据以响应,如果服务抛出错误,则不再监听事件 - 至少看起来如此,因为调试事件显示它们触发以及其他组件听他们回应。我假设这是错误的结果,但由于我有一个捕获错误,我无法弄清楚为什么会发生这种情况。
这是一个简化的代码示例:
ngOnInit(): void {
merge(event1, event2)
.pipe(
switchMap(event => {
return this.service.loadResults()
.pipe(catchError(() => {
return observableOf([]);
}));
}))
.subscribe(data => {
this.entityList = data;
});
}
其他没有帮助的尝试:
ngOnInit(): void {
merge(event1, event2)
.pipe(
switchMap(event => {
return this.service.loadResults();
})).pipe(
catchError(() => {
return observableOf([]);
})
)
)
.subscribe(data => {
this.entityList = data;
});
}
和:
ngOnInit(): void {
merge(event1, event2)
.pipe(
switchMap(event => {
return this.service.loadResults();
}),
catchError(() => {
return observableOf([]);
}))
.subscribe(data => {
this.entityList = data;
});
}
解决方案
这就是 RxJS 的switchMap
工作原理。一旦Observable
再次project
调用该project
函数以生成新的Observable
.
改为使用mergeMap
。
参考:
https://rxjs-dev.firebaseapp.com/api/operators/switchMap#description
当一个新的内部 Observable 被发射时,switchMap 停止从之前发射的内部 Observable 发射项目,并开始从新的发射项目。对于后续的内部 Observable,它继续表现得像这样。
推荐阅读
- c++ - 为什么不能删除正确的节点?
- javascript - 当使用 Vuejs 更改对象中的任何数据时,如何运行函数?
- java - 用空字符串装饰器替换 null
- javascript - 不推荐使用 event.target 吗?
- regex - 正则表达式之间的等价
- azure - Azure 策略要求创建某个标记,但不使用默认值?
- unity3d - 如何根据方向将相机定位在玩家后面并在Unity中查看该方向
- cordova - ionic cordova平台添加android源码路径不存在:resources/android/icon/drawable-hdpi-icon.png
- node.js - 如何使用护照节点设置管理员密码
- regex - 给定两个正则表达式,确定一个是否是另一个的补充