優(yōu)化 requestUserProfile
并發(fā)請求
requestUserProfile
是個通用用戶信息接口浮驳,通過傳入uid蛔翅,拿用戶昵稱
在一個群聊里有10多個用戶胶惰,點擊群聊信息哎迄,展示各個人的昵稱
10個并發(fā)請求谭贪,會阻塞接口
10個依次請求蜡励,耗時久令花,顯示昵稱太慢
需要優(yōu)化請求,在并發(fā)和耗時之間掌握一個平衡
import { isEqual } from 'lodash-es';
// 核心用戶請求
let _requestTime = 0;
const requestProfile = (uid: string) => {
// 這個方法的實現(xiàn)不能修改
return Promise.resolve().then(() => {
return new Promise<void>((resolve) => {
setTimeout(() => {
// 模擬 ajax 異步凉倚,1s 返回
resolve();
}, 1000);
}).then(() => {
_requestTime++;
return {
uid,
nick: `nick-${uid}`,
age: '18',
};
});
});
};
/**
* @param uid uid
* @param max 最多并發(fā)請求數(shù)量
*/
const requestUserProfile = (uid = '1', max = 2) => {
// 這里調(diào)用requestProfile 進(jìn)行優(yōu)化
};
/**
* 以下為測試用例兼都,無需修改
*/
export default async () => {
try {
const star = Date.now();
await Promise.all([
requestUserProfile('1'),
requestUserProfile('2'),
requestUserProfile('3'),
requestUserProfile('1'),
]).then((result) => {
if (Date.now() - star < 2000 || Date.now() - star >= 3000) {
throw new Error('Wrong answer');
}
if (
!isEqual(result, [
{
uid: '1',
nick: 'nick-1',
age: '18',
},
{
uid: '2',
nick: 'nick-2',
age: '18',
},
{
uid: '3',
nick: 'nick-3',
age: '18',
},
{
uid: '1',
nick: 'nick-1',
age: '18',
},
])
) {
throw new Error('Wrong answer');
}
});
return _requestTime === 3;
} catch (err) {
console.warn('測試運行失敗');
console.error(err);
return false;
}
};