用加载锁(loading flag)防止重复请求,下拉刷新用防抖(200–300ms),滚动加载用节流(150ms)加触底余量(80px),并配合加载锁;可选 Axios Cancel Token 取消冗余请求。

在移动端做手势下拉刷新或滚动到底部加载更多时,重复触发 AJAX 请求很常见。根本原因不是“用户手速快”,而是事件监听机制本身缺乏状态控制——滚动、touchend 等事件高频触发,每次满足条件就发请求,没管上一次是否完成。
用加载锁(Loading Flag)最直接有效
这是适配所有场景的底层保障,尤其适合滚动加载和下拉刷新混合使用的页面:
- 定义一个布尔变量 loading = false,全局或模块级维护
- 每次准备发起请求前,先判断 if (loading) return
- 确认要加载后,立即设为 loading = true
- 在请求的 always 或 finally 中重置 loading = false,确保失败也不卡死
下拉刷新用防抖(Debounce),等用户真正松手再执行
下拉刷新本质是“最后一次操作才生效”,防抖比节流更贴切:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 监听 touchend 或自定义下拉释放事件,而不是持续监听 touchmove
- 把整个刷新逻辑(校验下拉距离、调接口、重置 UI)包进防抖函数
- 延迟时间建议 200–300ms:太短拦不住快速连拉,太长有延迟感
- 注意每次触发都要重置定时器,不能复用同一个 timer 变量
滚动加载用节流(Throttle)+ 触底余量,避免高频检查
滚动事件每秒可触发数十次,但你不需要每像素都判断是否到底——节流能稳定控频:
立即学习“Java免费学习笔记(深入)”;
- 设定固定间隔(如 150ms),期间只允许执行一次触底检测
- 触底判断别用精确相等,加 50–100px 余量: window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 80
- 节流函数内部仍需配合 loading 锁,防止两次节流窗口内请求并发
额外建议:取消冗余请求(可选增强)
对长列表、搜索类场景,后发先至容易覆盖 UI,可进一步用 Axios Cancel Token 主动终止旧请求:
- 每个请求生成唯一 cancelToken
- 新请求发出前,检查同类型旧请求是否 pending,是则调用 cancel()
- 注意仅对“参数变化即代表新意图”的接口启用(如筛选条件变更),分页加载不建议取消,否则会中断连续加载

















