提问人:Maarten 提问时间:11/10/2023 最后编辑:Mark RotteveelMaarten 更新时间:11/11/2023 访问量:41
如何等待与身份验证相关的 Promise 解析?
How to wait for an authentication related Promise to resolve?
问:
我正在创建一个具有 Firebase 身份验证的 React 应用程序。成功登录后,我正在查询 Firestore 数据库中的用户文档,以请求登录用户的全名。
此全名用于应用程序的多个部分。但是,这些组件有时会在身份验证完成之前呈现,从而使全名保持“未定义”。
这种情况通常的做法是什么?我是否应该检查全名在我使用全名的所有地方是否不是“未定义”的?或者有没有办法让应用程序等到完整的身份验证过程完成(包括 Firestore 查询),然后才呈现组件?
AuthContext
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged(async (user) => {
if (user) {
// user is logged in
setCurrentUser(user);
const userDataPromise = await getUserData(user);
setUserData(userDataPromise);
} else {
// user is logged out
setCurrentUser(null);
setUserData(null);
}
setLoading(false);
});
return unsubscribe;
}, []);
return (
<AuthContext.Provider
value={{
currentUser,
userData,
}}
>
{loading ? <LinearProgress /> : children}
</AuthContext.Provider>
);
getUserData:
export default async function getUserData(currentUser) {
if (currentUser) {
// Get user
const userRef = doc(db, "users", currentUser.uid);
const userSnap = await getDoc(userRef);
if (!userSnap.exists()) {
console.log("No user data found in the database.");
return null;
} else {
const userData = userSnap.data();
// some additional querying...
return userData;
}
} else {
console.warning("User not logged in");
}
}
答:
0赞
Renaud Tarnec
11/10/2023
#1
这种情况通常的做法是什么?我应该检查fullName吗? 在我使用它的所有地方都不是“未定义”的吗?或者有没有办法 让应用等待,直到完整的身份验证过程完成 (包括 Firestore 查询),然后才渲染组件?
Web 应用与 Firebase 后端服务之间的所有交互都是异步操作(JS SDK 中的相应方法会返回 Promise)。
因此,您需要在应用程序中处理这方面的问题。例如,显示一个微调器,直到对 Firestore 的调用完成(即直到调用 Firestore 方法返回的 Promise,例如,在出现错误时被拒绝)。getDoc()
(如果您共享一些代码,请准备进一步提供帮助)
评论
0赞
Maarten
11/10/2023
谢谢雷诺。我已经添加了相关代码。我正在寻找一种方法来显示 <LinearProgress />,直到 setCurrentUser 和 setUserData 都完成。也许像 {loading || !currentUser || !userData ? <LinearProgress /> : children} ?
0赞
Renaud Tarnec
11/10/2023
是的,您需要使用基于异步操作完成时修改的某些布尔值的条件呈现。
评论