Javascript 如何清除useffect调用中的函数?

Javascript 如何清除useffect调用中的函数?,javascript,reactjs,react-native,Javascript,Reactjs,React Native,所以我在更新useEffect钩子中的状态,并得到这个错误,如果我们在useEffect钩子中使用异步/等待语法,我不知道如何使用清理函数 错误:警告:无法对未安装的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。若要修复此问题,请取消%s.%s中的所有订阅和异步任务,这是一个useEffect清理函数 const getToken = async () => { const mytoken = await AsyncStorage.getIt

所以我在更新useEffect钩子中的状态,并得到这个错误,如果我们在useEffect钩子中使用异步/等待语法,我不知道如何使用清理函数

错误:警告:无法对未安装的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。若要修复此问题,请取消%s.%s中的所有订阅和异步任务,这是一个useEffect清理函数


  const getToken = async () => {
    const mytoken = await AsyncStorage.getItem("fb_token");
    if (mytoken) {
      navigation.navigate("Main", { screen: "Map" });
      setToken(mytoken);
    } else {
      setToken(false);
    }
  };
    getToken();

  }, [navigation]);```

How to update state and use clean up function should i declare this function outside hook but if i do that how would i use that function as a clean up?

当组件卸载或由于某个
useffect
依赖项发生更改而重新安装时,您可以通过从返回函数获得回调。你可以用它来设置一个标志,让自己知道事情已经改变了。请参见
***
注释:

useEffect(() => {
    let cancelled = false; // *** A flag to let us know this is cancelled

    const getToken = async () => {
        const mytoken = await AsyncStorage.getItem("fb_token");
        if (!cancelled) { // *** Check the flag
            if (mytoken) {
                navigation.navigate("Main", { screen: "Map" });
                setToken(mytoken);
            } else {
                setToken(false);
            }
        }
    };
    getToken().catch(error => {                 // ***
        // Handle/report error here...          // *** Handle errors from the async function
    });                                         // ***

    // *** A callback to let us know to set the flag
    return () => {
        cancelled = true;
    };
}, [navigation]);
(您还违反了上面标记的承诺规则之一:始终要么处理错误,要么将承诺链传递到将发生的事情上。)

请注意,正如我前面提到的,这将在两种情况下跳过设置令牌:

  • 未安装的组件(给您带来麻烦的组件)

  • 导航
    已更改


  • 当组件卸载或由于某个
    useffect
    依赖项发生更改而重新安装时,您可以通过从返回函数获得回调。你可以用它来设置一个标志,让自己知道事情已经改变了。请参见
    ***
    注释:

    useEffect(() => {
        let cancelled = false; // *** A flag to let us know this is cancelled
    
        const getToken = async () => {
            const mytoken = await AsyncStorage.getItem("fb_token");
            if (!cancelled) { // *** Check the flag
                if (mytoken) {
                    navigation.navigate("Main", { screen: "Map" });
                    setToken(mytoken);
                } else {
                    setToken(false);
                }
            }
        };
        getToken().catch(error => {                 // ***
            // Handle/report error here...          // *** Handle errors from the async function
        });                                         // ***
    
        // *** A callback to let us know to set the flag
        return () => {
            cancelled = true;
        };
    }, [navigation]);
    
    (您还违反了上面标记的承诺规则之一:始终要么处理错误,要么将承诺链传递到将发生的事情上。)

    请注意,正如我前面提到的,这将在两种情况下跳过设置令牌:

  • 未安装的组件(给您带来麻烦的组件)

  • 导航
    已更改


  • 导航到另一页后,您正在执行
    setToken
    。这可能就是问题所在如果我在导航函数之前调用setToken,那么之后我需要调用clean up函数吗?看看这是否有帮助:@Edward ya it Help,特别是导航到另一个页面后您正在执行的useRef方法
    setToken
    。这可能就是问题所在如果我在导航函数之前调用setToken,那么之后我需要调用clean up函数吗?看看这是否有帮助:@Edward ya it Help,特别是useRef方法