当前位置: 首页 > 面试题库 >

取消componentWillUnmount方法中的所有订阅和异步,如何?

钱哲茂
2023-03-14
问题内容

由于异步方法问题,我收到一条错误消息。在我的终端中,我看到:

Warning: Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
- node_modules/fbjs/lib/warning.js:33:20 in printWarning
- node_modules/fbjs/lib/warning.js:57:25 in warning
- node_modules/react-native/Libraries/Renderer/ReactNativeRenderer-dev.js:12196:6 in warnAboutUpdateOnUnmounted
- node_modules/react-native/Libraries/Renderer/ReactNativeRenderer-dev.js:13273:41 in scheduleWorkImpl
- node_modules/react-native/Libraries/Renderer/ReactNativeRenderer-dev.js:6224:19 in enqueueSetState
- node_modules/react/cjs/react.development.js:242:31 in setState
* router/_components/item.js:51:16 in getImage$
- node_modules/regenerator-runtime/runtime.js:62:44 in tryCatch
- node_modules/regenerator-runtime/runtime.js:296:30 in invoke
- ... 13 more stack frames from framework internals

我注意到这是特别指出 getImage$

这是我用于该部分的代码:

export default class extends Component {
    constructor(props) {
        super(props);
        const { item } = props

        const bindThese = { item }
        this.boundActionCreators = bindActionCreators(bindThese)

        this.state = {
            image: require('../../static/logo.png'),
            ready: false,
            showOptions: this.props.showOptions
        }

        this.getImage = this.getImage.bind(this)
        this.renderNotAdmin = this.renderNotAdmin.bind(this)
        this.renderAdmin = this.renderAdmin.bind(this)
        this.handleOutOfStock = this.handleOutOfStock.bind(this)
    }

    async getImage(img) {
        let imgUri = await Amplify.Storage.get(img)
        let uri = await CacheManager.get(imgUri).getPath()

        this.setState({
            image: { uri },
            ready: true
        })
    }

    componentDidMount() {
        this.getImage(this.props.item.image)
    }

我试图弄清楚如何在componentWillUnmount此异步方法中使用a 。我该怎么办?

谢谢!


问题答案:

您可以isMounted在此处使用React模式来避免内存泄漏。

在您的构造函数中:

constructor(props) {
    super(props);

    this._isMounted = false;
// rest of your code
}

componentDidMount() {
    this._isMounted = true;
    this._isMounted && this.getImage(this.props.item.image);

}

在你的 componentWillUnmount

componentWillUnmount() {
   this._isMounted = false;
}

在你里面 getImage()

async getImage(img) {
    let imgUri = await Amplify.Storage.get(img)
    let uri = await CacheManager.get(imgUri).getPath()

    this._isMounted && this.setState({
        image: { uri },
        ready: true
    })
}

基于可取消承诺模式的推荐使用 Axios的 方法。因此,您可以在卸载组件的同时取消任何网络呼叫cancelToken subscription。这是Axios取消的资源



 类似资料:
  • 如何取消/中止angular 4中所有挂起的HTTP请求。 有一个取消HTTP请求的方法,但是如何一次取消所有挂起的请求。 尤其是在改变路线的时候。 我做了一件事 但是如何在全球范围内实现这一点 有什么想法吗?

  • 问题内容: 在该程序包下,您有诸如和之类的类,我想可以将其描述为一些可用的示例。 这些主题如何退订?没有方法,并且调用完全结束了Observable,对吗? 问题答案: 同时是an 和an ,可以像普通可观察对象一样取消订阅。使主题特别之处在于它是可观察者和观察者之间的桥梁。它可以通过释放观测到的项目,也可以发射新的项目。就像对期货的承诺一样,主体是可观察的对象。 这是主题科的简短说明: Asyn

  • 问题内容: 我认为标题说明了一切。每当我卸载仍在读取的组件时,都会显示黄色警告。 安慰 警告:无法在未安装的组件上调用(或)。这是一项禁忌措施,但是…若要修复,请取消方法中的所有订阅和异步任务。 问题答案: 当您触发Promise时,它可能需要花费几秒钟的时间才能解决,到那时,用户可能已经导航到应用程序中的另一个位置。因此,在未安装的组件上执行Promise resolves时,您会得到一个错误-

  • 我使用SockJS和StompJS,当我在浏览器中打开我的应用程序时,有时它会在连接到websocket之前尝试订阅一些主题。我希望主题订阅等待应用程序连接到websocket。 这就是我实现此代码的原因,我将其称为: 因此,我只在连接状态为时才订阅该主题,并且只有在客户端首次成功连接时才会调用该主题。 我想稍后从主题中取消订阅,所以我需要内部订阅返回的对象,我还需要内部订阅的消息。 我所实现的很

  • 问题:我订阅了一个永无止境的消息服务,我的代码需要检查任何消息是否满足条件,如果满足,然后在处理所有消息并返回true之前关闭订阅。如果我已经处理了所有的消息,但条件不满足,那么我需要关闭订阅并返回false。 例如,条件是: 我使用的订阅有一个同步方法,我必须传递。下面是适用于这两种情况的功能代码,跟踪最后一次接收消息的时间(以标识消息的结尾),告诉我是否获得了数据: 更多信息:的类型是(来自N

  • 我有一个类处理一个图像,这可能是一个缓慢的过程。当工作完成时,该类包含图像的一些特性,如主色。 我有许多其他的代码想知道主颜色,当他们要求它时,它可能是或可能没有准备好。 我还没有找到使用RXJava2实现这一点的简单方法。有人能帮帮我吗? null ReplaySubject似乎有一些我正在寻找的属性,但我不确定如何正确地实现它。