Angular - DialogRef - Отказаться от подписки - Нужно ли мне отказываться от подписки на afterClosed?

Один из моих коллег спросил меня, нужно ли нам отказаться от подписки на afterClosed () Observable диалога.

Мы используем шаблон takeUntil, чтобы отказаться от подписки на все Observables на ngOnDestroy ().

this.backEvent = fromEvent(window, 'popstate')
    .pipe(
        takeUntil(this.destroy$)
    )
    .subscribe(
        () => {
            this.navigationService.backClicked = true;
            this.navigationService.navigateBackToDirectoryCenter();
        }
    );

ngOnDestroy ()

ngOnDestroy() {
    this.destroy$.next();
    this.destroy$.complete();
}

Так нужно ли отказываться от подписки на afterClosed () Observable?

dialogRef.afterClosed().subscribe(
    (data) => {
            console.log(data);
        }
    },
);

or?

dialogRef.afterClosed()
    .pipe(
        takeUntil(this.destroy$)
    )
    .subscribe(
        (data) => {
            console.log(data);
        },
    );

person liqSTAR    schedule 02.10.2019    source источник
comment
Я никогда не отказывался от подписки на диалог после его закрытия, и ничего не сломалось (пока). Но хороший вопрос.   -  person Orestis Zekai    schedule 02.10.2019
comment
НЕТ, вам не нужно отказываться от подписки, так как она завершается автоматически.   -  person Archit Garg    schedule 02.10.2019


Ответы (3)


No

Вам не нужно отказываться от подписки по мере завершения самого наблюдаемого объекта. Вы можете проверить то же самое, добавив блок finalize, чтобы увидеть, завершается ли наблюдаемый объект сам или нет.

import { finalize } from "rxjs/operators";
dialogRef
  .afterClosed()
  .pipe(finalize(() => console.log("completed")))
  .subscribe(data => {
    console.log(data);
  });

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

person Archit Garg    schedule 02.10.2019
comment
Работает ли это так же, если вы связываете некоторые наблюдаемые с помощью switchMap? - person wisnix; 18.07.2020

Хороший вопрос, только что посмотрел документы (https://material.angular.io/components/dialog/overview), похоже, ничего не намекает на необходимость вообще отказаться от подписки, того, что у вас уже есть, должно хватить.

person CacheMoneyPlaya    schedule 02.10.2019

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

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

Компонент хоста, который вызывает dialogRef.afterClosed(), может быть уничтожен, пока диалог остается видимым. Подписка будет выдаваться после закрытия, и когда вы обращаетесь к свойству компонента внутри блока подписки, это выдает ошибку.

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

person Simon Hansen    schedule 20.07.2021