RXJS Subject - 阻止错误传播

RXJS Subject - stopping errors from propagating

当多个观察者订阅一个 RXJS 主题时,是否可以阻止一个观察者传播错误并阻止其他观察者(稍后注册)看到该事件

Stackblitz 示例:https://stackblitz.com/edit/rxjs-cy7swm

const sub = new Subject<string>();

sub.asObservable().subscribe((val) => {
  console.log('1st sees: ' + val);
});

sub.asObservable().subscribe((val) => {
  console.log('2nd sees: ' + val);
  throw new Error('2nd throws error');
});

sub.asObservable().subscribe((val) => {
  console.log('3rd sees: ' + val);
});

sub.next('test');
sub.next('test2');

这里第三个观察者没有看到事件,因为第二个观察者抛出异常,并且 test2 值没有被任何东西看到,因为第一个错误有效地关闭了主题

1st sees: test
2nd sees: test
ERROR Error: 2nd throws error

没有明显包装每个订阅块在 try catch 中,是否有更好的 RXJS 框架方法确保第三个观察者仍然看到值和第二次调用 sub.next() 也被观察到了?

更新(根据 cartant 的回答):

这在 rxjs6 中得到了更好的处理 - 请参阅使用相同代码但没有副作用的更新 Stackblitz:https://stackblitz.com/edit/rxjs6-subject-err

这是 RxJS v5 的一个已知问题,它已在 v6 中得到解决 - 其中 synchronous error handling has been changed.

在 v6 中,您所看到的将不再发生。相反,从 'listeners' 中抛出的错误将被异步重新抛出,并且应用程序会将其视为未处理的错误。

有关详细信息,请参阅 this video