如何将全局变量转为Promise?Firebase认证数据存入Svelte Store问题
解决Firebase Auth用户数据Promise未正确resolve及同步到Svelte Store的问题
问题根源分析
你的代码存在几个核心逻辑错误:
demo函数调用无参数:account = demo()未传入任何参数,导致函数内await Authuser实际是await undefined,最终返回的Promise会resolve为undefined。- 注册流程未关联
account:HandleSubmition中调用demo(userCredential)但未将结果赋值给account,account仍指向无参数调用的demo()返回的Promise。 - Google登录赋值覆盖Promise:
handleGoogleSignup中直接将account赋值为userCredential.user(普通对象),破坏了account作为Promise的预期。
修复后的代码
以下是调整后的完整代码,确保account始终是可resolve的Promise,并同步到Svelte Store:
import { firebaseConfig } from "../firebase"; import { user } from "../Stores"; import { link } from "svelte-spa-router"; import { onMount } from 'svelte'; import { getAuth, createUserWithEmailAndPassword, GoogleAuthProvider, signInWithPopup, onAuthStateChanged } from "firebase/auth"; let email; let password; let account; // 存储用户数据的Promise // 邮箱密码注册 const HandleSubmition = async () => { try { const userCredential = await createUserWithEmailAndPassword( getAuth(), email, password ); // 将account设为resolve用户数据的Promise account = Promise.resolve(userCredential.user); // 同步到Svelte Store $user = userCredential.user; email = ""; password = ""; console.log("注册成功,用户数据:", userCredential.user); } catch (error) { console.error("注册失败:", error); // 失败时返回reject的Promise,保持account的Promise类型 account = Promise.reject(error); } }; // Google登录 const handleGoogleSignup = () => { // 直接将account赋值为Google登录的Promise account = signInWithPopup(getAuth(), new GoogleAuthProvider()) .then(userCredential => { const userData = userCredential.user; $user = userData; console.log("Google登录成功,用户数据:", userData); return userData; }) .catch(error => { console.error("Google登录失败:", error); throw error; }); }; // 监听Auth状态变化,自动同步到account和Store onMount(() => { const unsubscribe = onAuthStateChanged(getAuth(), currentUser => { account = Promise.resolve(currentUser); $user = currentUser; console.log(currentUser ? "用户已登录" : "用户已退出"); }); // 组件销毁时取消监听 return unsubscribe; }); // 测试account的Promise account?.then(value => { console.log("当前用户数据:", value); }).catch(err => { console.error("获取用户数据失败:", err); });
关键修复说明
- 移除冗余的
demo函数:直接使用Firebase返回的userCredential.user作为用户数据源,避免无意义的Promise包装。 - 统一
account的Promise类型:无论是注册、登录还是状态监听,都确保account始终是一个Promise,要么resolve为用户数据/null,要么reject为错误信息。 - 自动同步到Svelte Store:通过
onAuthStateChanged监听用户状态变化,实现用户数据自动同步到Store,覆盖页面刷新、自动登录等场景。 - 错误捕获处理:添加错误捕获逻辑,避免Promise静默失败,同时保持
account的Promise类型一致性。
内容的提问来源于stack exchange,提问作者Niraj
相关产品推荐
相关产品推荐

