为什么 Rxjs 在订阅回调中出错会退订?
Why does Rxjs unsubscribe on error in the subscription callback?
我使用 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;
};
这个可能与我的问题有关。但是情况有点不同,没有提供答案。
试试这个。您应该将逻辑放在运算符中,而不是在订阅中。
看看这个问题
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()
会保留订阅。
我使用 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;
};
这个
试试这个。您应该将逻辑放在运算符中,而不是在订阅中。 看看这个问题 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()
会保留订阅。