diff --git a/client/shared/model/user.ts b/client/shared/model/user.ts index 8905cac9..c0d8ff33 100644 --- a/client/shared/model/user.ts +++ b/client/shared/model/user.ts @@ -4,6 +4,9 @@ import { sharedEvent } from '../event'; import { SYSTEM_USERID } from '../utils/consts'; import { createAutoMergedRequest } from '../utils/request'; import _pick from 'lodash/pick'; +import _uniq from 'lodash/uniq'; +import _flatten from 'lodash/flatten'; +import _zipObject from 'lodash/zipObject'; import { t } from '../i18n'; import { parseUrlStr } from '../utils/url-helper'; @@ -263,20 +266,29 @@ export async function fetchUserInfo(userId: string): Promise { return userInfo; } +const _fetchUserOnlineStatus = createAutoMergedRequest( + async (userIdsList) => { + const uniqList = _uniq(_flatten(userIdsList)); + // 这里用post是为了防止一次性获取的userId过多超过url限制 + const { data } = await request.post('/api/gateway/checkUserOnline', { + userIds: uniqList, + }); + + const map = _zipObject(uniqList, data); + + // 将请求结果根据传输来源重新分组 + return userIdsList.map((userIds) => + userIds.map((userId) => map[userId] ?? false) + ); + } +); /** * 获取用户在线状态 */ export async function getUserOnlineStatus( userIds: string[] ): Promise { - const { data } = await request.post( - '/api/gateway/checkUserOnline', - { - userIds, - } - ); - - return data; + return _fetchUserOnlineStatus(userIds); } /** diff --git a/client/shared/utils/request.ts b/client/shared/utils/request.ts index 285d2d89..d2fffe73 100644 --- a/client/shared/utils/request.ts +++ b/client/shared/utils/request.ts @@ -1,7 +1,7 @@ interface QueueItem { params: T; resolve: (r: R) => void; - reject: (reason: any) => void; + reject: (reason: unknown) => void; } /** @@ -25,12 +25,12 @@ export function createAutoMergedRequest( try { const list = await ret; - _queue.forEach((q_1, i) => { - q_1.resolve(list[i]); + _queue.forEach((q1, i) => { + q1.resolve(list[i]); }); } catch (err) { - _queue.forEach((q_2) => { - q_2.reject(err); + _queue.forEach((q2) => { + q2.reject(err); }); } } diff --git a/server/services/core/user/user.service.ts b/server/services/core/user/user.service.ts index 6c531bcd..18f096d7 100644 --- a/server/services/core/user/user.service.ts +++ b/server/services/core/user/user.service.ts @@ -682,6 +682,7 @@ class UserService extends TcService { /** * 获取用户信息的批量操作版 + * 用于优化网络访问性能 */ async getUserInfoList(ctx: PureContext<{ userIds: string[] }>) { const userIds = ctx.params.userIds;