提问者:小点点

Angular 2/Rxjs:我真的需要退订吗?


我明白,当组件被销毁时,我必须取消订阅某些可观察对象(即:具有无限价值的可观察对象),以防止内存泄漏。我不需要对有限的可观察对象这样做,因为它们将完成并自动取消订阅

但是如果我在我的组件中创建了一个无限的可观察的(例如FormGroup. value,或QueryList.change),这个将被包含它的组件销毁,所以我认为即使我不取消订阅它,它们也不会有内存泄漏。

这里有一个简单的例子:

@Component({})
export class DummyComponent {
    form: FormGroup;

    constructor(private fb: FormBuilder) {
        this.form = this.fb.group({
            firstName: [''],
            lastName: ['']
        });
        this.form.valueChanges.subscribe(
            x => console.log(x)
        );
    }
}

在这里,我不this. form.value eChange取消订阅;当我的组件被销毁时,this.form.value eChange也会被销毁。

这种情况下会有内存泄漏吗?


共2个答案

匿名用户

正如Babar提到的,您需要取消订阅以阻止这些订阅继续关注更改。

对于你的特殊情况,我认为你有道理。

当我在同一个组件中有很多订阅时,我会做以下事情。

首先我创建“订阅”,一个订阅类型的空数组。

private subscriptions: Subscription[] = [];

然后每次我需要做订阅时,我都会将其推送到数组中

this.subscriptions.push(this.form.valueChanges.subscribe(x => console.log(x)));

在ngOnDestroy中,我取消订阅数组内的每个订阅。

ngOnDestroy(): void {
  this.subscriptions.forEach((elem) => { elem.unsubscribe(); })
}

匿名用户

当您的组件被破坏您的订阅者不是他们还在等待任何事件来到他们这将花费内存,以及有时它可能会扰乱你的逻辑,以及。

我的第二种情况是,如果您在组件之间切换并且从未取消订阅,您的应用程序将在一段时间后挂起,因为每当您加载组件时,新订阅者都会绑定。

@Component({})
export class DummyComponent implements OnDestroy {
 form: FormGroup;
 subscription: Subscription; // from rxjs
 constructor(private fb: FormBuilder) {
    this.form = this.fb.group({
        firstName: [''],
        lastName: ['']
    });
    this.subscription = this.form.valueChanges.subscribe(
        x => console.log(x)
    );
 }

 ngOnDestroy(): void {
  this.subscription.unsubscribe();
 }
}