如何检测rxjs订户何时退订?

Pet*_*ris 5 rxjs

每当主题的最后一个订阅者退订时,我都需要运行一些清理代码。我该怎么做?

到目前为止,这是我所拥有的,但是在我看来,这并不是一个好方法。当然有reactive办法吗?

export class TestSubject<T> extends BehaviorSubject<T> {
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    const originalSubscription = super._subscribe(subscriber);
    return new TestSubjectSubscription<T>(
      this,
      subscriber,
      originalSubscription,
      (observer) => this.registerUnsubscription(observer));
  }

  private registerUnsubscription(subscriber: Observer<T>) {
  }

}

export class TestSubjectSubscription<T> extends SubjectSubscription<T> {
  constructor(
    subject: TestSubject<T>,
    subscriber: Observer<T>,
    private inner: Subscription,
    private notifyUnsubscribed: (subscriber: Observer<T>) => void) {
    super(subject, subscriber);
  }

  unsubscribe() {
    this.inner.unsubscribe();
    this.notifyUnsubscribed(this.subscriber);
  }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ten 3

.finally()可用于在流完成后调用回调(错误/完成/取消订阅)

  • 当父级完成时,它会在订阅者上执行,我需要相反的方式:当最后一个订阅者取消订阅时,我需要我的主题执行代码。 (2认同)
  • 对于那些使用 rxjs 6 的人,您可能需要“finalize”,例如。`whatever.pipe(finalize(() =&gt; console.log('成功、错误和取消订阅时触发'))).subscribe(() =&gt; ...` (2认同)