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

标签 typescript rxjs

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

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/

相关文章:

javascript - Angular HttpClient post 方法参数

javascript - 用于类型检查和编译错误的 Typescript 外部函数

TypeScript 忽略 const 类型。为什么会这样编译?

typescript - 如何将 typescript 内部模块与 AMD 模块一起使用

angular - 如何调试 Angular2/Typescript 中的 Observable 值?

javascript - 还是不明白 RXJS operator combineLatestAll 是如何工作的?

arrays - 在 Angular 2 中将 Json 数据从服务器存储到数组

http - 如何避免 jsonp 请求超时错误?

javascript - rxjs 将 forkjoin 传递给一个返回可观察数组的函数

angular2 observable.fromEvent 与按钮单击