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

时间:2017-07-08 13:40:29

标签: 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的唯一方法?

1 个答案:

答案 0 :(得分:2)

这是正确的行为。您可以使用catch()运算符再次订阅相同的源Observable(或者在出错时订阅另一个源)。

source
  .catch(err => Observable.of(null))
  .subscribe(...);

这只会在null处理程序中返回next而不是原始错误。

另请注意,如果订阅者没有任何error处理程序,则会重新引发任何异常。

例如,为了避免抛出您可能犯的错误:

source
  ...
  .subscribe(..., error => {});

然而,这将始终取消订阅链,因为这是Observables的基本原则之一。它们会发出零个或多个next个通知以及一个completeerror个通知,但不会同时发出这两个通知。

很难说你想要解决的问题是什么?你有时可以使用Subject并只传递next次通知并忽略其余的......:

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

subject.subscribe(...);