Files
his/openhis-ui-vue3/src/utils/globalRequestController.js

94 lines
2.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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