【问题标题】:Why does Rxjs unsubscribe on error in the subscription callback?为什么 Rxjs 在订阅回调中出错时取消订阅?
【发布时间】:2019-03-20 13:14:19
【问题描述】:

我使用 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】:

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

【讨论】:

  • 我已经稍微修改了你的小提琴以使其更干净jsfiddle.net/Eugene_Ilyin/7tmuLjyb。感谢你付出的努力。它对我的帮助并不理想,但我认为 RxJS 5.2.0 尽可能好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2018-07-29
  • 2021-11-18
  • 1970-01-01
  • 2018-05-08
  • 2017-03-26
  • 2020-10-28
相关资源
最近更新 更多