/** * 全局请求控制器 - 用于在整个应用范围内控制重复请求 * 特别针对医院信息系统中的病历数据访问进行优化 */ class GlobalRequestController { constructor() { // 存储正在进行的请求 this.activeRequests = new Map(); // 请求计数器,用于调试 this.requestCounter = 0; } /** * 生成请求的唯一标识符 * @param {string} url - 请求URL * @param {object} params - 请求参数 * @returns {string} 唯一标识符 */ generateRequestId(url, params = {}) { // 标准化参数以确保一致性 const normalizedParams = this.normalizeParams(params); const paramString = JSON.stringify(normalizedParams); return `${url}|${paramString}`; } /** * 标准化参数对象 * @param {object} params - 原始参数 * @returns {object} 标准化后的参数 */ normalizeParams(params) { const normalized = {}; // 按字母顺序排序参数键 Object.keys(params).sort().forEach(key => { normalized[key] = params[key]; }); return normalized; } /** * 检查是否已有相同请求在进行中 * @param {string} requestId - 请求ID * @returns {Promise|undefined} 如果存在则返回Promise,否则返回undefined */ hasActiveRequest(requestId) { return this.activeRequests.get(requestId); } /** * 注册一个新请求 * @param {string} requestId - 请求ID * @param {Promise} requestPromise - 请求Promise */ registerRequest(requestId, requestPromise) { this.requestCounter++; console.log(`[GlobalRequestController] Registering request #${this.requestCounter}: ${requestId}`); this.activeRequests.set(requestId, requestPromise); // 当请求完成时,从活动请求中移除 requestPromise.finally(() => { console.log(`[GlobalRequestController] Removing completed request: ${requestId}`); this.activeRequests.delete(requestId); }); } /** * 执行请求(确保相同参数的请求只执行一次) * @param {Function} apiFunction - API函数 * @param {string} url - 请求URL * @param {object} params - 请求参数 * @returns {Promise} 请求结果Promise */ async execute(apiFunction, url, params = {}) { const requestId = this.generateRequestId(url, params); // 检查是否已有相同请求在进行中 const existingRequest = this.hasActiveRequest(requestId); if (existingRequest) { console.log(`[GlobalRequestController] Returning existing request for: ${requestId}`); return existingRequest; } // 创建新请求 const requestPromise = apiFunction(params); this.registerRequest(requestId, requestPromise); return requestPromise; } } // 创建全局实例 const globalRequestController = new GlobalRequestController(); export default globalRequestController;