技术与生活 / 一篇记录
搜索框防抖之后,还要处理旧响应
输入连续发生时延后处理,可以减少搜索或布局计算次数。
防抖减少的是请求触发次数,不会自动取消已经发出的请求。较早发出的慢请求可能较晚返回,把较新的搜索结果覆盖掉,形成另一种竞态。
操作与观察
以下示例可在现代浏览器的开发者工具中观察;涉及 DOM 的代码需要在网页环境运行。
let timer; function searchLater(fn) { clearTimeout(timer); timer = setTimeout(fn, 250); }
连续触发三次,只应执行最后一次回调。
连续输入不同关键词并模拟不同响应时长。可以为请求分配序号,仅采纳最新结果;支持取消的接口还可以使用 AbortController 减少无用工作。
页面卸载或组件销毁时,待执行定时器也需要按生命周期清理。否则回调可能操作已经不存在的元素,或者把旧状态写回新页面,形成难以稳定复现的界面问题。
别遗漏这条边界
防抖不保证网络响应按顺序返回,仍需处理过期请求。
参考:JavaScript 文档。