Promise 封装全屏遮罩加载控制计数器的核心是通过单例 loadingManager 维护全局计数器,仅在 0→1 时显示、1→0 时隐藏遮罩;withLoading 工具函数自动调用 start/end,支持并发嵌套且 finally 保证 end 执行,计数器下限保护防误调用。

用 Promise 封装全屏遮罩加载控制计数器,核心是让遮罩的显示与隐藏由“加载中”状态的增减自动驱动,避免手动调用 show/hide 导致状态错乱。关键在于:维护一个全局计数器,只在计数器从 0→1 时显示遮罩,从 1→0 时隐藏遮罩;每个异步操作通过 Promise 包裹并自动参与计数。
封装一个可复用的 loadingManager
定义一个单例管理器,内部维护计数器和 DOM 遮罩元素。不依赖框架,纯原生实现:
- 初始化时创建并隐藏全屏遮罩(带 loading 动画),插入 body 底部
- 提供 start() 方法:计数器 +1,若为 1 则显示遮罩
- 提供 end() 方法:计数器 -1,若降为 0 则隐藏遮罩
- 确保 end 不会低于 0(防误调用)
用 Promise 包装异步操作并自动绑定 loading
写一个工具函数 withLoading(promise),它接收任意 Promise,在执行前后自动调用 start/end:
- 调用时立即 start(),触发遮罩可能显示
- 返回原 promise 的结果,并在 finally 中调用 end()
- 即使 promise 被 reject,finally 仍会执行,保证遮罩一定收起
- 示例:
await withLoading(fetch('/api/data'))—— 请求期间自动显示遮罩
支持嵌套与并发请求不冲突
多个 withLoading 同时运行时,计数器叠加,只有最后一个结束才隐藏遮罩:
立即学习“Java免费学习笔记(深入)”;
- 比如同时发起 3 个 API 请求,start() 被调 3 次 → 计数器 = 3
- 前两个 resolve 后计数器变为 1,遮罩仍保持显示
- 第三个结束,计数器归 0,遮罩才隐藏
- 无需关心调用顺序或 await 排队,天然支持并发与嵌套
简单使用示例
只需两步即可接入现有代码:
- 引入 loadingManager(一次初始化)
- 把要加 loading 的异步调用包进 withLoading,例如:
const data = await withLoading(api.getUser())
或链式:withLoading(fetch('/save')).then(res => ...)
不复杂但容易忽略细节:务必确保 end() 在 finally 中调用,且计数器做下限保护。这样就能零耦合、高可靠地统一管理所有异步 loading 状态。


















