筆試題:調用接口并發(fā)請求控制

優(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) => {
  // 這個方法的實現不能修改
  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ā)請求數量
 */
const requestUserProfile =  (uid = '1', max = 2) => {
  // 這里調用requestProfile 進行優(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;
  }
};

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容