Утечки памяти в Angular2 + при использовании подписчиков и subscribe.first () - PullRequest
0 голосов
/ 29 января 2019

Я работаю с приложением Angular2, которое запускается через электрон.В настоящее время я стремлюсь улучшить производительность приложения и уменьшить утечки памяти.Я понимаю, что вам нужно уничтожать подписчиков при уничтожении приложения, чтобы они не наблюдали за новыми значениями.Но нужно ли уничтожить подписку, которая запускается только один раз?

ObservableVar.subscribe().first((ans) => { // Wanting to use only one ans
    dostuff(ans);
}

1 Ответ

0 голосов
/ 29 января 2019

Нет, вам не нужно уничтожать подписку, которая запускается только один раз, поскольку наблюдаемое завершится само собой.Это то же самое, если вы используете take(1).

Вот документ RxJS о first и take .

Вы должны использовать ихкак это:

myOvservable.pipe(first()).subscribe(value => { /* do something */ });
myOvservable.pipe(take(1)).subscribe(value => { /* do something */ });

Если у вас есть несколько подписок, чтобы отказаться от подписки, может быть целесообразно использовать трюк takeUntil.Вы создаете тему, в которой вы вводите фиктивное значение, когда хотите, чтобы ваши наблюдаемые были завершены:

unsubscribe = new Subject<void>();

myObs1.pipe(takeUntil(this.unsubscribe)).subscribe(value => { /* do something */ });
myObs2.pipe(takeUntil(this.unsubscribe)).subscribe(value => { /* do something */ });

// trigger the unsubscription
this.unsubscribe.next();

Примечание: takeUntil должен быть последним оператором в последовательности каналов, чтобы избежать утечек( см. Эту статью ).

Вы также можете использовать класс Subscription для управления своими подписками:

subscriptions = new Subscription();

this.subscriptions.add(myObs1.subscribe(value => { /* do something */ }));
this.subscriptions.add(myObs2.subscribe(value => { /* do something */ }));

// unsubscribe
this.subscriptions.unsubscribe();
...