如何等待与身份验证相关的 Promise 解析?

How to wait for an authentication related Promise to resolve?

提问人:Maarten 提问时间:11/10/2023 最后编辑:Mark RotteveelMaarten 更新时间:11/11/2023 访问量:41

问:

我正在创建一个具有 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");
  }
}
javascript firebase google-cloud-firestore 异步 await

评论


答:

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
是的,您需要使用基于异步操作完成时修改的某些布尔值的条件呈现