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