You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将全局变量转为Promise?Firebase认证数据存入Svelte Store问题

解决Firebase Auth用户数据Promise未正确resolve及同步到Svelte Store的问题

问题根源分析

你的代码存在几个核心逻辑错误:

  1. demo函数调用无参数:account = demo()未传入任何参数,导致函数内await Authuser实际是await undefined,最终返回的Promise会resolve为undefined。
  2. 注册流程未关联account:HandleSubmition中调用demo(userCredential)但未将结果赋值给account,account仍指向无参数调用的demo()返回的Promise。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:20:30