如何解决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 发射项目。对于后续的内部 Observable,它会继续像这样运行。
,我在 stackbliz.com 中对其进行了测试,当我手动抛出错误时它起作用了,但我认为这与来自服务的抛出错误相同。这是演示:https://stackblitz.com/edit/angular-ivy-gvvwbb?file=src/app/app.component.ts
merge(this.event1,this.event2)
.pipe(
switchMap(event => {
return throwError("error").pipe(
catchError(() => {
return of(
event.target["innerHTML"] === "event1 div"
? "catch error from div 1"
: "catch error from div 2"
);
})
);
})
)
.subscribe(data => {
console.log("data = ",data);
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。