我正在与一个订阅者作斗争,它会在出错时自动取消订阅:
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?
最佳答案
这是正确的行为。您可以使用 catch()
运算符再次订阅相同的源 Observable(或出错时订阅不同的源)。
source
.catch(err => Observable.of(null))
.subscribe(...);
这只会在 next
处理程序中返回 null
而不是原始错误。
另请注意,如果订阅者没有任何error
处理程序,则会重新抛出任何异常。
例如,为了避免抛出您可能会犯的错误:
source
...
.subscribe(..., error => {});
然而,这将始终取消订阅链,因为这是 Observables 的基本原则之一。它们会发出零个或多个 next
通知和一个 complete
或 error
通知,但不会同时发出两者。
很难说出你想解决什么问题你不想退订,有时你可以使用 Subject
并只传递给它 next
通知并忽略其余的……:
const subject = new Subject();
source.subscribe(val => subject.next(val));
subject.subscribe(...);
关于typescript - 订阅者不应该在可观察的错误中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986873/