修复分享页面不能访问问题
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user