我正在努力与订阅者合作,该订阅者会在出错时自动取消订阅:
observable
.subscribe(
(data) => {
// some logic encountering an error during execution
// comparable to throw new Error()
}
)
我可以使用try / catch阻止它:
observable
.subscribe(
(data) => try {
// some logic encountering an error during execution
// comparable to throw new Error()
} catch(e) {
}
)
但感觉就像是一种解决方法。
我已经深入了解Subscriber和SafeSubscriber的来源,它会在出错时自动调用取消订阅:
private __tryOrUnsub(fn: Function, value?: any): void {
try {
fn.call(this._context, value);
} catch (err) {
this.unsubscribe();
throw err;
}
}
是阻止此行为实现自己的订阅服务器还是使用try / catch的唯一方法?
答案 0 :(得分:2)
这是正确的行为。您可以使用catch()
运算符再次订阅相同的源Observable(或者在出错时订阅另一个源)。
source
.catch(err => Observable.of(null))
.subscribe(...);
这只会在null
处理程序中返回next
而不是原始错误。
另请注意,如果订阅者没有任何error
处理程序,则会重新引发任何异常。
例如,为了避免抛出您可能犯的错误:
source
...
.subscribe(..., error => {});
然而,这将始终取消订阅链,因为这是Observables的基本原则之一。它们会发出零个或多个next
个通知以及一个complete
或error
个通知,但不会同时发出这两个通知。
很难说你想要解决的问题是什么?你有时可以使用Subject
并只传递next
次通知并忽略其余的......:
const subject = new Subject();
source.subscribe(val => subject.next(val));
subject.subscribe(...);