我需要确定处理可观察对象的两种不同方法是否同样有效,或者一种方法是否会导致内存问题。
在下面的示例中,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();
}
}
来自棱角分明的团队
异步管道订阅可观察或promise并返回它发出的最新值。当发出新值时,异步管道会标记要检查更改的组件。当组件被销毁时,异步管道会自动取消订阅以避免潜在的内存泄漏。
因此,异步管道负责订阅和展开数据以及在组件销毁时取消订阅。
否,异步管道订阅可观察或promise并返回它发出的最新值。当发出新值时,异步管道会标记要检查更改的组件。当组件被销毁时,异步管道会自动取消订阅以避免潜在的内存泄漏。