Signed-off-by: 吴文峰 <kevin@lmve.net>
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
* 用户信息缓存
|
||||
*/
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user