经过几天的调查(!)对于当前Angular2应用程序的巨大内存泄漏,我提出了一个新发现:
显然,在整个应用程序中大量使用的异步管道正在订阅一个可观察的管道,但在组件和管道清理时从未发布(未订阅)。
它为一次可以观察到的事件积累了11,000名观察者,很少有用户操作(这最终导致了应用程序崩溃)。
我需要取消可观察到的订阅,为了做到这一点,我需要一个钩子来破坏,类似于ngOnDestroy,但是对于管道。
是否有这样的钩子,如果没有,你建议如何取消订阅?
发布于 2016-06-01 21:43:58
如果您查看一下异步管道代码,就会发现它们使用ngOnDestroy,就像在指令中那样。
来自AsyncPipe代码的代码片段:
@Pipe({name: 'async', pure: false})
@Injectable()
export class AsyncPipe implements OnDestroy {
...
ngOnDestroy(): void {
if (isPresent(this._subscription)) {
this._dispose();
}
}
...
}关键是使用:pure:false,
要创建有状态管道,您应该实现这个接口,并在PipeMetadata中将纯参数设置为false。 给定相同的输入,有状态管道可能产生不同的输出。有状态管道很可能包含在破坏绑定时应该清理的状态。例如,可能需要释放对数据流的订阅,或者可能需要清除间隔。
https://stackoverflow.com/questions/37578834
复制相似问题