首页 > 解决方案 > 错误后角度停止监听 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;
         });
}



   

标签: angularerror-handlingevent-handling

解决方案


这就是 RxJS 的switchMap工作原理。一旦Observable再次project调用该project函数以生成新的Observable.

改为使用mergeMap

参考:

https://rxjs-dev.firebaseapp.com/api/operators/switchMap#description

当一个新的内部 Observable 被发射时,switchMap 停止从之前发射的内部 Observable 发射项目,并开始从新的发射项目。对于后续的内部 Observable,它继续表现得像这样。


推荐阅读