在頁(yè)面刷新后,getUserInfo()
方法會(huì )被執行兩次:
src/permission.ts
)state: () => ({
// ...其他狀態(tài)
isLoadingUserInfo: false, // ?? 防止重復調用的標志
lastUserInfoFetch: 0, // ?? 最后一次獲取的時(shí)間戳
})
async getUserInfo(forceRefresh: boolean = false) {
const now = Date.now();
const CACHE_DURATION = 30 * 1000; // 30秒緩存
// ?? 防重復調用檢查
if (!forceRefresh) {
// 正在加載中,跳過(guò)
if (this.isLoadingUserInfo) {
console.log('?? getUserInfo 正在執行中,跳過(guò)重復調用');
return;
}
// 緩存未過(guò)期且數據存在,跳過(guò)
if (緩存有效 && 數據完整) {
console.log('?? getUserInfo 緩存未過(guò)期,跳過(guò)重復調用');
return;
}
}
// ?? 執行實(shí)際的獲取邏輯
this.isLoadingUserInfo = true;
try {
// 獲取用戶(hù)信息...
} finally {
this.isLoadingUserInfo = false;
}
}
現在每次調用都會(huì )輸出詳細日志:
?? getUserInfo 正在執行中,跳過(guò)重復調用
?? getUserInfo 緩存未過(guò)期,跳過(guò)重復調用
?? 開(kāi)始獲取用戶(hù)信息...
? 用戶(hù)信息獲取成功: {
name: "用戶(hù)名",
hasDataInfo: true,
hasMenuList: true,
timestamp: "12:34:56"
}
await userStore.getUserInfo();
// 30秒內重復調用會(huì )被跳過(guò)
await userStore.getUserInfo(true);
// 或者使用便捷方法
await userStore.forceRefreshUserInfo();
// permission.ts 中的調用會(huì )自動(dòng)使用緩存機制
await userStore.getUserInfo();
const CACHE_DURATION = 30 * 1000; // 可調整緩存時(shí)間
// 當滿(mǎn)足以下條件時(shí)使用緩存:
// 1. 不是強制刷新
// 2. 沒(méi)有正在加載
// 3. 緩存時(shí)間未過(guò)期
// 4. 用戶(hù)數據完整
現在 getUserInfo()
方法具備了完整的防重復調用機制!