【发布时间】: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