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されますか?
のソースを見ると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
、ガベージコレクションの目的で呼び出す必要はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加