61 lines
1.3 KiB
JavaScript
61 lines
1.3 KiB
JavaScript
/**
|
||
* 用户信息缓存
|
||
*/
|
||
import { ref } from 'vue'
|
||
import { usersApi } from '../api/users'
|
||
|
||
// 全局缓存
|
||
const usersInfo = ref({})
|
||
// 请求中的 promiseMap,防止重复请求
|
||
const inflightRequests = {}
|
||
|
||
/**
|
||
* 根据用户ID获取用户信息(带缓存)
|
||
* @param {number} userID
|
||
* @returns {Promise<{Username, UserEmail} | null>}
|
||
*/
|
||
export async function fetchUserInfo(userID) {
|
||
if (!userID) return null
|
||
|
||
// 已有缓存
|
||
if (usersInfo.value[userID]) {
|
||
return usersInfo.value[userID]
|
||
}
|
||
|
||
// 请求中,等待完成
|
||
if (inflightRequests[userID]) {
|
||
return inflightRequests[userID]
|
||
}
|
||
|
||
// 发起请求
|
||
const promise = usersApi.getUserInfoFromUserID(userID).then((res) => {
|
||
if (res.errCode === 0 && res.raw?.return?.userinfo) {
|
||
const info = res.raw.return.userinfo
|
||
usersInfo.value[userID] = info
|
||
return info
|
||
}
|
||
return null
|
||
}).finally(() => {
|
||
delete inflightRequests[userID]
|
||
})
|
||
|
||
inflightRequests[userID] = promise
|
||
return promise
|
||
}
|
||
|
||
/**
|
||
* 根据用户ID获取用户名(同步,需先调用 fetchUserInfo)
|
||
* @param {number} userID
|
||
* @returns {string}
|
||
*/
|
||
export function getUsername(userID) {
|
||
if (!userID) return ''
|
||
const user = usersInfo.value[userID]
|
||
return user?.Username || `用户${userID}`
|
||
}
|
||
|
||
export default {
|
||
fetchUserInfo,
|
||
getUsername
|
||
}
|