为什么Rxjs在订阅回调中发生错误时取消订阅?

时间:2019-03-20 13:14:20

标签: javascript rxjs rxjs5

我使用RxJS 5.2.0(是的,它已经很旧了)。 我订阅了一些可观察的内容,并且想要执行一些代码。 如果此代码中出现js错误,则RxJS只会取消订阅我的订阅者,并且不会向控制台报告错误。

这对我来说非常糟糕,因为错误将被隐藏并且我看不到并纠正。也许,我的项目中已经有一些错误,但是我不知道这些错误。

我看到的唯一方法是将订户中的所有代码包装到try-catch中。但是看起来很疯狂,有数百个这样的地方。

我将在几个月后更新RxJS,但是现在找到解决此问题的解决方案将是很棒的。

以下是jsfiddle https://jsfiddle.net/Eugene_Ilyin/18kw3hde/

上的示例
let subj = new Rx.BehaviorSubject(1);

subj.asObservable().subscribe(number => {
  console.log(number);
  let book;
  book.page();
  console.log(number);
});

setTimeout(() => {
  subj.next(2);
}, 1000);

有一行book.page();会引发错误。但是在浏览器的控制台中,您将看不到任何错误。错误发生后,将不会再次调用该订阅。因为它将被RxJS取消订阅,所以当它通过以下代码捕获错误时:

SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
    try {
        fn.call(this._context, value);
    }
    catch (err) {
        parent.syncErrorValue = err;
        parent.syncErrorThrown = true;
        return true;
    }
    return false;
};

question可能与我的问题有关。但是情况有些不同,无法提供答案。

1 个答案:

答案 0 :(得分:1)

尝试一下。您应该将逻辑放在运算符中,而不是在内部订阅中。 看看这个问题 rxjs. is it good practice to have code in subscribe method?

let subj = new Rx.BehaviorSubject(1);

subj.asObservable().do(()=>{
  console.log(number);
  let book;
  book.page();
  console.log(number);
}).catch(e => {
  console.error(e);
  return Rx.Observable.throw(e)
}).onErrorResumeNext()
  .subscribe(number => {
});

setTimeout(() => {
  subj.next(2);
}, 1000);

catch运算符将捕获您的错误,而onErrorResumeNext()将保留订阅。

https://jsfiddle.net/cvd7Lu4q/

相关问题