Javascript 为什么Rxjs在订阅回调出错时取消订阅?

Javascript 为什么Rxjs在订阅回调出错时取消订阅?,javascript,rxjs,rxjs5,Javascript,Rxjs,Rxjs5,我使用RxJS 5.2.0(是的,它非常旧)。 我订阅了一些可观察的,我想执行一些代码。 如果此代码中存在js错误,那么RxJS将取消订阅我的订户,并且不会向控制台报告错误 这对我来说非常糟糕,因为错误将被隐藏,我无法看到并更正它。也许,我的项目中已经有一些错误,但我不知道它们 我看到的唯一方法是将订阅服务器中的所有代码包装到try-catch中。但它看起来很疯狂,有数百个这样的地方 我将在几个月内更新RxJS,但如果现在能找到解决这个问题的方法,那就太好了 下面是一个关于JSFIDLE的示例

我使用RxJS 5.2.0(是的,它非常旧)。 我订阅了一些可观察的,我想执行一些代码。 如果此代码中存在js错误,那么RxJS将取消订阅我的订户,并且不会向控制台报告错误

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

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

我将在几个月内更新RxJS,但如果现在能找到解决这个问题的方法,那就太好了

下面是一个关于JSFIDLE的示例

有一行
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;
};

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

试试这个。您应该将逻辑放在运算符中,而不是放在subscribe中。 看看这个问题

catch
操作员将捕获您的错误,
onerrorcumennext()
将保留订阅


似乎与你有关,你说得对,@martin。谢谢。修复问题#3803已包含在RxJS v6.3.3中。我对您的小提琴做了一些修改,使其更干净。谢谢你的努力。这对我来说并不理想,但我认为RxJS 5.2.0尽可能好。
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;
};
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);