【问题标题】:RXJS Subject - stopping errors from propagatingRXJS 主题 - 阻止错误传播
【发布时间】:2019-02-17 10:57:03
【问题描述】:

当多个观察者订阅一个 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');

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

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

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

更新(根据卡坦特的回答):

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

【问题讨论】:

  • 我认为问题在于您在.subscribe 中抛出了一个错误,我认为您无法在任何地方发现它。你在做什么会在.subscribe 块内引发错误?
  • 这与RxJS无关,因此无法由它处理。由于抛出异常,整个脚本停止执行。
  • @ExplosionPills - 不是显式地抛出错误,而是由于非防御性编码而可能发生的任何运行时错误。在我的具体情况下,主题充当事件队列,如果一个侦听器出现运行时错误,主题如果有效关闭并且不再发布事件
  • @abetteroliver - 是和不是。 Subject.next 似乎没有任何尝试/捕获来解决这个问题 - 这将是一种解决方案(提交问题),但我正在寻找其他创造性的方式(github.com/ReactiveX/rxjs/blob/master/src/internal/…

标签: typescript rxjs rxjs5


【解决方案1】:

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

在 v6 中,您所看到的将不再发生。相反,从“侦听器”中抛出的错误将被异步重新抛出,并被应用程序视为未处理的错误。

如需了解更多信息,请参阅this video

【讨论】:

  • 谢谢 - 所以除了用 try/catch 将逻辑包装在每个订阅 lambda 中之外,没有明显的 v5 解决方法
  • 不。虽然,我想你可以尝试猴子修补 subscribe 来捕获错误并异步重新抛出,但我不能确定这是否可行(我不推荐它)。
  • 同时阅读您发布的链接,这似乎与处理可观察流中的错误更相关,而不是某个特定观察者出现错误并破坏其他听众和原始主题。
  • 大部分信息都在视频中。文档链接并不理想,但这些更改与行为直接相关。我在文档中找不到对“干扰”问题的参考 - 因此是视频。
猜你喜欢
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多