94 lines
2.8 KiB
JavaScript
94 lines
2.8 KiB
JavaScript
/**
|
||
* 全局请求控制器 - 用于在整个应用范围内控制重复请求
|
||
* 特别针对医院信息系统中的病历数据访问进行优化
|
||
*/
|
||
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; |