Нужна ли отмена подписки, если Observable использует асинхронный канал? - PullRequest
1 голос
/ 08 мая 2019

Мне нужно определить, являются ли два разных подхода к обработке наблюдаемых одинаково допустимыми, или один из них вызовет проблемы с памятью.

В следующем примере foo$ и bar являются переменными шаблона, которые получают своиценности из службы.У каждого своя наблюдаемая.В компоненте bar явно присваивается его значение из подписки, а затем эта подписка заканчивается в OnDestroy().Однако foo$ явно не подписывается на службу, а использует async канал в шаблоне.

Являются ли foo$ и bar допустимыми способами отображения служебных данных, или foo$ проблематично, поскольку нет отписки для очистки памяти?

ExampleService:

Injectable()
export class ExampleService {
    get foo$(): Observable<string> {
        return data.from.api;
    }

    get bar$: Observable<string> {
        return data.from.api;
    }
}

ПримерКомпонента:

@Component({
    template: `
        <div>{{ foo$ | async }}</div>
        <div>{{ bar }}</div>
    `
})
export class ExampleComponent implements OnInit, OnDestroy {
    public foo$ = this._exampleService.foo$;
    public bar = '';
    private _destroy$ = new Subject();

    constructor(private _exampleService: ExampleService) {}

    public ngOnInit() {
        this._exampleService.bar$
            .pipe(takeUntil(this._destroy$))
            .subscribe(bar => this.bar = bar);
    }

    /**
     * Cancel subscriptions.
     */
    public ngOnDestroy() {
        this._destroy$.next(true);
        this._destroy$.complete();
    }
}

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

От команды angular

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

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

0 голосов
/ 08 мая 2019

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

...