perf: 优化getUserOnlineStatus的网络请求连接,自动合并多个请求为一个后端请求

以优化网络传输性能
feat/uniplus
moonrailgun 2 years ago
parent ca48e46215
commit 8f587887ee

@ -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<UserBaseInfo> {
return userInfo;
}
const _fetchUserOnlineStatus = createAutoMergedRequest<string[], boolean[]>(
async (userIdsList) => {
const uniqList = _uniq(_flatten(userIdsList));
// 这里用post是为了防止一次性获取的userId过多超过url限制
const { data } = await request.post('/api/gateway/checkUserOnline', {
userIds: uniqList,
});
const map = _zipObject<boolean>(uniqList, data);
// 将请求结果根据传输来源重新分组
return userIdsList.map((userIds) =>
userIds.map((userId) => map[userId] ?? false)
);
}
);
/**
* 线
*/
export async function getUserOnlineStatus(
userIds: string[]
): Promise<boolean[]> {
const { data } = await request.post<boolean[]>(
'/api/gateway/checkUserOnline',
{
userIds,
}
);
return data;
return _fetchUserOnlineStatus(userIds);
}
/**

@ -1,7 +1,7 @@
interface QueueItem<T, R> {
params: T;
resolve: (r: R) => void;
reject: (reason: any) => void;
reject: (reason: unknown) => void;
}
/**
@ -25,12 +25,12 @@ export function createAutoMergedRequest<T, R>(
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);
});
}
}

@ -682,6 +682,7 @@ class UserService extends TcService {
/**
*
* 访
*/
async getUserInfoList(ctx: PureContext<{ userIds: string[] }>) {
const userIds = ctx.params.userIds;

Loading…
Cancel
Save