【问题标题】:Memory leak error while calling fetch API in react在反应中调用 fetch API 时出现内存泄漏错误
【发布时间】:2021-10-10 16:50:36
【问题描述】:

我在 react 中编写了以下代码,但出现内存泄漏错误。我尝试了一些技巧,例如调用 abort 并将状态设置为 null,但到目前为止对我没有任何效果。

我遇到的错误:

无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要修复,请在使用 Effect 清理函数中取消所有订阅和异步任务。

我的代码 sn-p:

useEffect(() => {
    //some const defined
    fetch(myData)
        .then(response => response.json())
        .then(data => {
            //some code

            if (consition) {
                //setting state
                setData(abc);
                setDataPresent(true);
            }
        });
    // fix for memory leak error
    return () => {
        setData({});
        setDataPresent(false);
    };
}, [dep]);

【问题讨论】:

    标签: reactjs memory-leaks fetch react-component-unmount


    【解决方案1】:

    试试这个!您需要使用 useEffect 取消承诺。

    在下面的代码中,fetch 函数返回一个 promise。您可以通过在 useEffect 范围内设置条件来取消承诺,防止应用在组件卸载后设置状态。

    我建议阅读这篇关于在 useEffect 中取消承诺的简短文章。 https://juliangaramendy.dev/blog/use-promise-subscription

    不要忘记 useEffect 中的依赖关系。

    // Let's start!
    useEffect(() => {
        let isMounted = true;
    
        fetch(myData)
            .then(response => response.json())
            .then(data => {
                if (isMounted) {
                    setDataPresent(true)
                    setData(abc)
                }
            });
    
        return () => {
            isMounted = false;
        };
    }, [deps]);
    

    【讨论】:

    • 感谢@Ivan Popov 的解决方案。虽然现在它对我有用,但由于泄漏问题不会更频繁地产生,我需要再等一段时间。但现在它可以工作了,谢谢。
    • @coder91,我总是很乐意提供帮助。如果有类似的情况会在效果中使用 Promise,则创建一个钩子。您还可以使用我提供链接的文章中的钩子实现。编码愉快!)
    猜你喜欢
    • 2019-03-12
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多