【问题标题】:React native navigation error -TypeError: Cannot read property 'catch' of undefined反应本机导航错误-TypeError:无法读取未定义的属性'catch'
【发布时间】:2021-03-03 10:54:11
【问题描述】:

当从异步存储中加载正确的数据时,我会重新路由用户:

useEffect(() => {
        loadData(localStorageKeys.USER_LOGGED_IN, true)
            .then(isUserLoggedIn => {
                    if (isUserLoggedIn) {
                        props.navigation.navigate(NavigationLocations.DASHBOARD)
                            .catch(e => logNavigationError(e))
                    } else {
                        console.log("No user is signed in.");
                        console.log(AsyncStorage.getAllKeys());
                    }
                }
            )
            .catch(e => {
                console.error("Unable check locally if user is logged in.");
                debugger
                console.error(e);
            });
    }, []);

路由按预期工作,但是我收到此错误:

index.js:1 Unable check locally if user is logged in.
console.<computed> @ index.js:1
(anonymous) @ Signup.js:32
Promise.catch (async)
(anonymous) @ Signup.js:29
...

即使路由按预期进行,为什么还会出现错误?

【问题讨论】:

  • 为什么写这行.catch(e =&gt; logNavigationError(e))
  • 因为导航方法返回一个promise。

标签: javascript react-native promise react-navigation


【解决方案1】:

我认为这是因为navigation.navigate 不是Promise,因此它没有.catch 属性。如果您想在此处捕获错误,请改用try/catch

例如

useEffect(() => {
        loadData(localStorageKeys.USER_LOGGED_IN, true)
            .then(isUserLoggedIn => {
                    if (isUserLoggedIn) {
                        try {
                            props.navigation.navigate(NavigationLocations.DASHBOARD);
                        } catch (e) {
                            logNavigationError(e);
                        }   
                    } else {
                        console.log("No user is signed in.");
                        console.log(AsyncStorage.getAllKeys());
                    }
                }
            )
            .catch(e => {
                console.error("Unable check locally if user is logged in.");
                debugger
                console.error(e);
            });
    }, []);

【讨论】:

  • navigate(url: string): Promise&lt;WindowClient | null&gt;; - 这意味着有一个承诺返回,除非我弄错了?
  • 该类型来自 firebase 的 navigate 方法,而不是反应路由器的。
猜你喜欢
  • 1970-01-01
  • 2019-01-11
  • 2018-05-25
  • 2020-02-04
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多