gpt4 book ai didi

typescript - 订阅者不应该在可观察的错误中停止

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:31 26 4
gpt4 key购买 nike

我正在与一个订阅者作斗争,它会在出错时自动取消订阅:

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 通知和一个 completeerror 通知,但不会同时发出两者。

很难说出你想解决什么问题你不想退订,有时你可以使用 Subject 并只传递给它 next 通知并忽略其余的……:

const subject = new Subject();
source.subscribe(val => subject.next(val));

subject.subscribe(...);

关于typescript - 订阅者不应该在可观察的错误中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com