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

在函数中使用Svelte Store数据遇路由异常问题求助

问题根源与解决方案

核心错误原因

你的userStore实现中,writable的start函数被定义为async,这违反了Svelte Store的规则:start函数必须同步返回一个清理函数,而async函数会返回Promise,导致Svelte尝试执行这个Promise时抛出stop is not a function错误。

修复后的userStore代码

// firebase.js
function userStore() {
  let unsubscribe;
  if (!auth || !globalThis.window) {
    console.warn("Auth is not initialized or not in browser");
    const { subscribe } = writable(null);
    return { subscribe };
  }

  const { subscribe } = writable(auth?.currentUser ?? null, (set) => {
    // 将异步逻辑封装到内部函数,保持start函数同步
    const setupAuthListener = async () => {
      unsubscribe = onAuthStateChanged(auth, async (user) => {
        if (user) {
          const userDocRef = doc(db, "users", user.uid);
          const userDocSnap = await getDoc(userDocRef);
          const userData = userDocSnap.data();
          set(userData);
        } else {
          set(null);
        }
      });
    };

    setupAuthListener();

    // 同步返回清理函数
    return () => {
      if (unsubscribe) {
        unsubscribe();
      }
    };
  });

  return { subscribe };
}
export const user = userStore();

正确使用方式

修复Store后,你可以正常使用Svelte的Store语法:

  1. 直接使用$user(推荐)
    Svelte会自动处理订阅与取消订阅,无需手动操作:
import { user } from "$lib/firebase";
import { onMount } from 'svelte';

// 组件挂载后调用函数
onMount(() => {
  if ($user) {
    myFunc({ user: $user });
  }
});

// 或使用反应式语句,当user数据变化时自动触发
$: if ($user) {
  myFunc({ user: $user });
}
  1. 手动订阅+取消订阅
    现在unsubscribe会返回正确的清理函数,不会再报错:
import { user } from "$lib/firebase";
import { onDestroy } from 'svelte';

let userData;
const unsubscribe = user.subscribe((_userData) => {
  userData = _userData;
});

onDestroy(() => {
  unsubscribe();
});

内容的提问来源于stack exchange,提问作者mango

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:03:37