为什么Rxjs取消订阅订阅回调中的错误?

问题描述 投票:1回答:1

我使用RxJS 5.2.0(是的,它已经很老了)。我订阅了一些observable,我想执行一些代码。如果此代码中存在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可能与我的问题有关。但是有一些不同的情况,并没有提供答案。

javascript rxjs rxjs5
1个回答
1
投票

试试这个。你应该把逻辑放在运算符中,而不是在subscribe中。看看这个问题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/

© www.soinside.com 2019 - 2024. All rights reserved.