Нужно ли подписываться и удалять наблюдаемые в этих случаях? - PullRequest
0 голосов
/ 25 апреля 2020

Я здесь думаю о наблюдаемых.

И я представил следующие ситуации:

Пример 1) В моем случае, когда я использую NGRX I создать всю архитектуру правильно, и я создаю службу выбора для этого конкретного магазина.

В службе невозможно использовать ngOnDestroy, потому что это не компонент, и у меня есть следующий вопрос, есть ли память утечка в сервисе? Или этот сервис автоматически уничтожает наблюдаемые?

Пример 2) Используя селекторы в первом примере, необходимо ли подписаться на этот селектор, а затем уничтожить его?

ЛЮДИ-СЕЛЕКТОРЫ.СЕРВИС

@Injectable({ providedIn: 'root' })
export class PeopleSelectorsService {
    constructor(private readonly store: Store<StoreState>) {}

    get error(): Observable<IRequestError> {
        return this.store.pipe(select(fromPeopleSelectors.getError));
    }

    get loading(): Observable<boolean> {
        return this.store.pipe(select(fromPeopleSelectors.getLoading));
    }

    get main(): Observable<IPeople> {
        return this.store.pipe(select(fromPeopleSelectors.getMain));
    }

    get total(): Observable<number> {
        return this.store.pipe(select(fromPeopleSelectors.selectTotal));
    }

    get all(): Observable<Array<IPeople>> {
        return this.store.pipe(select(fromPeopleSelectors.selectAll));
    }

    get allIds(): Observable<Array<string | number>> {
        return this.store.pipe(select(fromPeopleSelectors.selectIds));
    }
}

APP.COMPONENT

    ngOnInit(): void {
        this.peopleDispatchService.getAll();
        this.isLoading$ = this.peopleSelectorsService.loading;
}

<main [attr.isLoading]="isLoading$ | async">
    <ng-container></ng-container>
    <app-loading-container *ngIf="isLoading$ | async; else isMainController"></app-loading-container>

    <ng-template #isMainController>
        <app-user-talk-controller-container></app-user-talk-controller-container>
        <app-user-talk-container></app-user-talk-container>
    </ng-template>
</main>

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

есть ли утечка памяти в сервисе? Или этот сервис автоматически уничтожает наблюдаемые?

Концепция уничтожения наблюдаемых не имеет смысла. Вы уничтожаете подписки (отписываясь), а не наблюдаемые. Так что нет, нет необходимости «уничтожать» наблюдаемые в вашем сервисе.

К вашему второму пункту нет. Канал asyn c автоматически отписывается при уничтожении компонента. Поэтому, пока вы используете async в шаблоне html, вам не нужно беспокоиться о подписке и отписке

2 голосов
/ 25 апреля 2020

Это совершенно нормально. Пока у вас нет подписки, у вас нет утечек памяти. async pipe знает, когда подписываться и когда отписываться, поэтому вам не нужно беспокоиться о забытых подписках, async отменит подписку, когда подписка больше не нужна.

Лучший способ - написать полный код каналов без какой-либо подписки ИМХО.

Например, в вашем случае я бы создал одну наблюдаемую в app.component.ts, которая объединяет все данные вместе и имеет одну наблюдаемую.

ngOnInit(): void {
  this.data$ = combineLatest(
    this.peopleSelectorsService.loading,
    this.peopleSelectorsService.all,    
  ).map(([isLoading, records]) => ({isLoading, records}));
}
<ng-container *ngIf="data$ | async as data">
<main [attr.isLoading]="data.isLoading">
    <ng-container></ng-container>
    <app-loading-container *ngIf="data.isLoading; else isMainController"></app-loading-container>

    <ng-template #isMainController>
        <app-user-talk-controller-container></app-user-talk-controller-container>
        <app-user-talk-container [records]="data.records"></app-user-talk-container>
    </ng-template>
</main>
</ng-container>

Основное преимущество, которое я вижу, состоит в том, что у нас одна подписка, и нет проблемы пересечения подписки, потому что время от времени в шаблоне, когда у вас есть несколько вложенных async, вы можете обнаружить, что они тоже могут зависеть друг от друга, и они не будет работать должным образом. с одной подпиской такой проблемы нет.

Также это то, что мы делаем в нашем текущем проекте. время от времени data$ довольно большой, но все же он чувствует себя лучше, чем несколько подписок в шаблоне или в классе.

...