修复分享页面不能访问问题

This commit is contained in:
张成
2025-11-17 23:39:55 +08:00
parent ed9c0e9768
commit 4568e758a7
4 changed files with 199 additions and 59 deletions

View File

@@ -11,27 +11,48 @@ export interface UserState {
updateUserInfo: (userInfo: Partial<UserInfoType>) => void;
}
const fetchUserInfo = async (set) => {
try {
const res = await fetchUserProfile();
set({ user: res.data });
return res.data;
} catch {}
// 请求锁,防止重复请求
let fetchingUserInfo = false;
let fetchUserInfoPromise: Promise<UserInfoType | undefined> | null = null;
const fetchUserInfoWithLock = async (set) => {
// 如果正在请求,直接返回现有的 Promise
if (fetchingUserInfo && fetchUserInfoPromise) {
return fetchUserInfoPromise;
}
fetchingUserInfo = true;
fetchUserInfoPromise = (async () => {
try {
const res = await fetchUserProfile();
set({ user: res.data });
return res.data;
} catch (error) {
console.error("获取用户信息失败:", error);
return undefined;
} finally {
fetchingUserInfo = false;
fetchUserInfoPromise = null;
}
})();
return fetchUserInfoPromise;
};
export const useUser = create<UserState>()((set) => ({
user: {},
fetchUserInfo: fetchUserInfo.bind(null, set),
fetchUserInfo: () => fetchUserInfoWithLock(set),
updateUserInfo: async (userInfo: Partial<UserInfoType>) => {
try {
// 先更新后端
await updateUserProfile(userInfo);
// 然后立即更新本地状态
// 然后立即更新本地状态(乐观更新)
set((state) => ({
user: { ...state.user, ...userInfo },
}));
// 最后重新获取完整用户信息确保数据一致性
await fetchUserInfo(set);
// 不再每次都重新获取完整用户信息,减少请求次数
// 只有在更新头像等需要服务器返回新URL的字段时才需要重新获取
// 如果需要确保数据一致性,可以在特定场景下手动调用 fetchUserInfo
} catch (error) {
console.error("更新用户信息失败:", error);
throw error;