节流函数核心是“匀速发”而非“等停手再发”,适用于搜索建议、实时位置上报、表单校验、图表刷新等需阶段性反馈的接口;需封装请求、支持leading/trailing选项,并配合取消重复请求、空值校验及服务端协同。

节流函数控制接口请求的高频调用,核心不是“等用户停手再发”,而是“匀速发”——在持续操作中按固定间隔发出请求,避免请求雪崩,同时保留关键中间状态。
节流适用于哪些接口场景
不是所有请求都适合节流。它适合那些需要阶段性反馈、且服务端能接受周期性调用的接口:
- 搜索建议(用户边输边查,每 300ms 取一次最新输入发请求)
- 实时位置上报(地图拖拽中每 500ms 上报一次中心坐标)
- 表单输入校验(邮箱/用户名格式检查,不需每次按键都验,但也不能只验最后一次)
- 图表数据刷新(滚动查看时间轴时,按视口变化节奏拉取新数据)
基础节流封装 + 请求适配
直接套用通用节流函数即可,关键是把 fetch 或 axios 调用包进被节流的函数里,并注意参数传递和错误处理:
function throttle(func, delay) {
let lastTime = 0;
return function(...args) {
const now = Date.now();
if (now - lastTime >= delay) {
func(...args);
lastTime = now;
}
};
}
<p>// 示例:节流后的搜索建议请求
const throttledSearch = throttle(async (query) => {
try {
const res = await fetch(<code>/api/suggest?q=${encodeURIComponent(query)}</code>);
const data = await res.json();
renderSuggestions(data);
} catch (err) {
console.warn('搜索请求失败', err);
}
}, 300);</p><p>// 绑定到输入框
inputEl.addEventListener('input', () => {
throttledSearch(inputEl.value.trim());
});带 leading + trailing 的增强控制
纯时间戳节流可能错过首次输入或最后输入。加选项后更稳妥:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- leading: true → 用户刚输入就立刻查一次,提升响应感
- trailing: true → 输入停止后补一次,确保最终内容不丢失
- 两者都开,适合既要即时反馈又要兜底的场景
实现上需结合定时器管理上次执行时间和 pending 状态,避免重复触发或漏触发。
必须配合的细节优化
光有节流不够,还需注意三点:
- 取消重复请求:用 AbortController 在新请求发起前 abort 旧请求,防止旧响应覆盖新结果
- 防空值/无效值调用:节流前先判断 query 是否有意义(如长度 ≥ 2),避免发无意义请求
- 服务端协同:告知后端这是节流请求,便于做缓存或合并策略(例如相同 query 在 100ms 内只处理一次)

















