私は 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 されるのかということです。
ベストアンサー1
ソースを見てみると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