提问者:小点点

如果可观察对象使用异步管道,是否需要取消订阅?


我需要确定处理可观察对象的两种不同方法是否同样有效,或者一种方法是否会导致内存问题。

在下面的示例中,foo$bar是从服务接收其值的模板变量。每个都有自己的可观察性。在组件中,bar从订阅中显式赋予其值,然后在OnDestroy()中结束该订阅。然而,foo$并没有显式订阅服务,而是在模板中使用async管道。

foo$bar都是显示服务数据的有效方式,还是foo$有问题,因为没有取消订阅内存清理?

示例服务:

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个答案

匿名用户

来自棱角分明的团队

异步管道订阅可观察或promise并返回它发出的最新值。当发出新值时,异步管道会标记要检查更改的组件。当组件被销毁时,异步管道会自动取消订阅以避免潜在的内存泄漏。

因此,异步管道负责订阅和展开数据以及在组件销毁时取消订阅。

匿名用户

否,异步管道订阅可观察或promise并返回它发出的最新值。当发出新值时,异步管道会标记要检查更改的组件。当组件被销毁时,异步管道会自动取消订阅以避免潜在的内存泄漏。