我是否需要填写主题才能进行垃圾回收?

时间:2017-05-31 16:15:49

标签: angular rxjs

我遵循Angular组件中的清理模式,如下所示:

class SomeComponent implements OnInit, OnDestroy {
    private destroy$ = new Subject();

    ngOnInit() {
        service.someStream().takeUntil(this.destroy$).subscribe(doSomething);
    }

    ngOnDestroy() {
        this.destroy$.next(true);
    }
}

这有利于在组件被销毁时自动取消订阅。

我的问题是:对destroy$的引用是否无限期地保留,因为我没有调用this.destroy$.complete(),或者在收集父类时是否会收到GC?< / p>

1 个答案:

答案 0 :(得分:13)

如果你查看Subject.complete的来源,你会找到答案:

complete() {
  if (this.closed) {
    throw new ObjectUnsubscribedError();
  }
  this.isStopped = true;
  const { observers } = this;
  const len = observers.length;
  const copy = observers.slice();
  for (let i = 0; i < len; i++) {
    copy[i].complete();
  }
  this.observers.length = 0;
}

调用complete通知任何观察者,然后清除观察者数组。除非您的观察者/订阅者具有对Subject的引用,否则complete实现中没有任何内容会影响Subject是否可以进行垃圾回收。

RxJS将通知推送给订阅者。订户不提及可观察者;反过来说。因此,除非您通过闭包或其他机制明确创建了一个包含Subject引用的订阅者,否则无需为了垃圾回收目的而调用complete