我试图建立一个简单的android应用程序使用React Native Firebase的身份验证监听onAuthStateChanged.如果我理解正确的onAuthStateChanged方法有多个状态,所以它会触发useEffect多次.问题是,我想在验证后触发一个函数,检查用户是否包含在一个firebase数据库,但是由于这个原因,该函数将被多次触发,当我在onAuthStateChanged函数中调用它时,它将返回undifine(两次)。
const [userDetails, setUserDetails] = useState();
const [initializing, setInitializing] = useState(true);
function onAuthStateChanged(user) {
if (user !== null) {
setUserDetails({
name: user.displayName,
email: user.email,
photo: user.photoURL,
theme: 'default',
});
if (initializing) setInitializing(false);
checkUserInDB()
} else {
setUserDetails(null);
setInitializing(true);
}
}
useEffect(() => {
const subscriber = auth().onAuthStateChanged(onAuthStateChanged);
return subscriber; // unsubscribe on unmount
}, []);
为了克服这个问题,我可以调用checkUserInDb()函数,方法是将它留在onAuthStateChanged之外,等待userDetails和初始化状态完成:
if (userDetails !== null && initializing === false) {
checkUserInDb()
虽然这将返回userDetails,但如果我记录它,它会发生3次。我试图从几个Angular 解决它(await /then/ timeout),但问题是在useEffect中,我只是用完了想法。如果你能给我指出正确的方向,我将不胜感激。
1条答案
按热度按时间qxgroojn1#
我花了几个小时来解决这个问题,我成功地克服了它。我相信onAuthStateChanged不喜欢我试图用上面的userDetails设置一个自定义状态。通过在文档中只使用user like,我没有undifenied返回.但它仍然不是问题的解决方案,因为它确实会onAuthStateChanged运行2-3次之前,其解决.我发现了另一个线程,有人使用了去抖动,我暗示,并与一点重构我原来的逻辑,它开始工作。