buddhism/utils/loading-manager.js

244 lines
5.2 KiB
JavaScript
Raw Normal View History

/**
* 全局自动Loading管理器
* 提供智能的Loading状态管理支持并发请求计数和超时保护
*/
// 环境配置
const ENV_CONFIG = {
develop: {
2025-08-14 17:06:05 +08:00
loadingText: "加载中~",
2025-08-14 11:22:53 +08:00
loadingTime: 100,
},
trial: {
2025-08-14 17:06:05 +08:00
loadingText: "加载中~",
2025-08-14 11:22:53 +08:00
loadingTime: 100,
},
release: {
2025-08-14 17:06:05 +08:00
loadingText: "加载中~",
2025-08-14 11:22:53 +08:00
loadingTime: 100,
},
2025-08-14 17:06:05 +08:00
};
// 获取当前环境配置
const getCurrentConfig = () => {
try {
2025-08-14 17:06:05 +08:00
const { envVersion } = wx.getAccountInfoSync().miniProgram;
console.log("当前环境:", envVersion);
return ENV_CONFIG[envVersion] || ENV_CONFIG.release;
} catch (error) {
2025-08-14 17:06:05 +08:00
console.warn("获取环境失败,默认使用正式环境:", error);
return ENV_CONFIG.release;
}
2025-08-14 17:06:05 +08:00
};
2025-08-14 17:06:05 +08:00
const config = getCurrentConfig();
// 全局状态管理
2025-08-14 17:06:05 +08:00
let isLoading = false;
let loadingTimer = null;
let loadingCount = 0; // 请求计数器
/**
* 设置loading超时自动清除
*/
const setLoadingTimeout = () => {
if (loadingTimer) {
2025-08-14 17:06:05 +08:00
clearTimeout(loadingTimer);
}
loadingTimer = setTimeout(() => {
2025-08-14 17:06:05 +08:00
console.warn("Loading超时强制清除");
forceHideLoading();
}, 30000); // 30秒超时
};
/**
* 显示加载状态
* @param {string} text - 加载提示文字
*/
function showLoading(text = config.loadingText) {
try {
2025-08-14 17:06:05 +08:00
loadingCount++;
if (!isLoading) {
2025-08-14 17:06:05 +08:00
isLoading = true;
uni.showLoading({
title: text,
2025-08-14 11:22:53 +08:00
mask: true,
2025-08-14 17:06:05 +08:00
});
// 设置超时清除
2025-08-14 17:06:05 +08:00
setLoadingTimeout();
console.log("显示Loading:", text);
}
} catch (error) {
2025-08-14 17:06:05 +08:00
console.warn("显示loading失败:", error);
}
}
/**
* 隐藏加载状态
*/
function hideLoading() {
try {
2025-08-14 17:06:05 +08:00
loadingCount--;
if (loadingCount > 0) {
2025-08-14 17:06:05 +08:00
console.log(
"还有其他请求在进行不隐藏Loading, 剩余请求数:",
loadingCount,
);
return; // 还有其他请求在进行
}
if (isLoading) {
2025-08-14 17:06:05 +08:00
isLoading = false;
// 清除超时定时器
if (loadingTimer) {
2025-08-14 17:06:05 +08:00
clearTimeout(loadingTimer);
loadingTimer = null;
}
2025-08-14 17:06:05 +08:00
uni.hideLoading();
console.log("隐藏Loading");
}
} catch (error) {
2025-08-14 17:06:05 +08:00
console.warn("隐藏loading失败:", error);
}
}
/**
* 强制隐藏loading
*/
export function forceHideLoading() {
try {
2025-08-14 17:06:05 +08:00
isLoading = false;
loadingCount = 0;
if (loadingTimer) {
2025-08-14 17:06:05 +08:00
clearTimeout(loadingTimer);
loadingTimer = null;
}
2025-08-14 17:06:05 +08:00
uni.hideLoading();
console.log("强制隐藏Loading");
} catch (error) {
2025-08-14 17:06:05 +08:00
console.warn("强制隐藏loading失败:", error);
}
}
/**
* 获取当前loading状态
* @returns {Object} loading状态信息
*/
export function getLoadingStatus() {
return {
isLoading,
loadingCount,
2025-08-14 11:22:53 +08:00
hasTimer: !!loadingTimer,
2025-08-14 17:06:05 +08:00
};
}
/**
* 设置loading配置
* @param {Object} newConfig - 新的配置
*/
export function setLoadingConfig(newConfig) {
2025-08-14 17:06:05 +08:00
Object.assign(config, newConfig);
console.log("更新Loading配置:", config);
}
/**
* 获取loading配置
* @returns {Object} 当前配置
*/
export function getLoadingConfig() {
2025-08-14 17:06:05 +08:00
return { ...config };
}
/**
* 显示loading带延迟
* @param {string} text - 加载提示文字
* @param {number} delay - 延迟时间毫秒
*/
2025-08-14 17:06:05 +08:00
export function showLoadingWithDelay(
text = config.loadingText,
delay = config.loadingTime,
) {
setTimeout(() => {
2025-08-14 17:06:05 +08:00
showLoading(text);
}, delay);
}
/**
* 隐藏loading带延迟
* @param {number} delay - 延迟时间毫秒
*/
export function hideLoadingWithDelay(delay = 500) {
setTimeout(() => {
2025-08-14 17:06:05 +08:00
hideLoading();
}, delay);
}
/**
* 初始化全局loading管理器
*/
export function initGlobalLoadingManager() {
// 监听页面显示事件
2025-08-14 17:06:05 +08:00
uni.$on("page-show", () => {
console.log("页面显示检查loading状态");
// 页面显示时检查loading状态如果超时则清除
if (isLoading && loadingTimer) {
2025-08-14 17:06:05 +08:00
const remainingTime =
30000 - (Date.now() - (loadingTimer._startTime || Date.now()));
if (remainingTime <= 0) {
2025-08-14 17:06:05 +08:00
console.warn("页面显示时发现超时loading强制清除");
forceHideLoading();
}
}
2025-08-14 17:06:05 +08:00
});
2025-08-14 11:22:53 +08:00
// 监听页面隐藏事件
2025-08-14 17:06:05 +08:00
uni.$on("page-hide", () => {
console.log("页面隐藏");
});
2025-08-14 11:22:53 +08:00
// 监听应用显示事件
2025-08-14 17:06:05 +08:00
uni.$on("app-show", () => {
console.log("应用显示");
});
2025-08-14 11:22:53 +08:00
// 监听应用隐藏事件
2025-08-14 17:06:05 +08:00
uni.$on("app-hide", () => {
console.log("应用隐藏清除loading");
forceHideLoading();
});
2025-08-14 11:22:53 +08:00
2025-08-14 17:06:05 +08:00
console.log("全局loading管理器已初始化");
}
/**
* 简化的自动loading管理类
*/
export class AutoLoadingManager {
constructor() {
2025-08-14 17:06:05 +08:00
this.isActive = false;
}
2025-08-14 11:22:53 +08:00
// 显示loading可选
2025-08-14 17:06:05 +08:00
show(text = "加载中...") {
this.isActive = true;
// 这里可以选择是否显示额外的loading
// 默认情况下所有API调用都会自动显示loading
}
2025-08-14 11:22:53 +08:00
// 隐藏loading可选
hide() {
2025-08-14 17:06:05 +08:00
this.isActive = false;
// 这里可以选择是否手动隐藏loading
// 默认情况下API调用完成后会自动隐藏loading
}
2025-08-14 11:22:53 +08:00
// 销毁管理器
destroy() {
2025-08-14 17:06:05 +08:00
this.isActive = false;
// 页面卸载时可以选择是否强制清除loading
// forceHideLoading()
}
}
// 导出内部方法供request.js使用
2025-08-14 17:06:05 +08:00
export { showLoading, hideLoading, config };