可以在componentWillUnmount中使用组件方法作为异步回调导致内存泄漏吗?

时间:2018-12-05 20:52:35

标签: reactjs

setState内部的异步函数中调用componentWillUnmount可能导致内存泄漏:https://medium.freecodecamp.org/how-to-work-with-react-the-right-way-to-avoid-some-common-pitfalls-fc9eb5e34d9e

public componentWillUnmount(): void {
    this.subscription.unsubscribe().catch(this.onError);
}

鉴于上述情况,这还会产生内存泄漏吗?可以在unsubscribe完成之前卸载组件,因此直到卸载后才调用组件的onError方法。组件是否会被垃圾回收?

1 个答案:

答案 0 :(得分:0)

本文并没有说setState 会导致发生内存泄漏。

  

无法在已卸载的组件上调用setState(或forceUpdate)。这是无人操作,但它指示您的应用程序中的内存泄漏。

问题不仅限于setStateforceUpdate。它们只是React可以在需要时跟踪并发出警告的方法。他们的电话表明,组件实例在卸载后正在发生某些事情。

在卸载之后引用this组件实例意味着在完成涉及this的操作之前,不能对组件实例进行垃圾回收。如果操作立即完成,则不会发生内存泄漏。万一花了几分钟,那就有泄漏了。

只要this.subscription.unsubscribe()不会导致长期运行的承诺或待处理的承诺,而这将导致在短时间内不调用this.onError,并且onError不包含麻烦的代码,它不应引起内存泄漏。这是属于componentWillUnmount的代码的示例。

从钩子方法返回一个承诺也可能是有益的,因此可以在测试中对其进行监视和链接。