← 全部文章

技术与生活 / 一篇记录

搜索框防抖之后,还要处理旧响应

输入连续发生时延后处理,可以减少搜索或布局计算次数。

防抖减少的是请求触发次数,不会自动取消已经发出的请求。较早发出的慢请求可能较晚返回,把较新的搜索结果覆盖掉,形成另一种竞态。

操作与观察

以下示例可在现代浏览器的开发者工具中观察;涉及 DOM 的代码需要在网页环境运行。

let timer; function searchLater(fn) { clearTimeout(timer); timer = setTimeout(fn, 250); }

连续触发三次,只应执行最后一次回调。

连续输入不同关键词并模拟不同响应时长。可以为请求分配序号,仅采纳最新结果;支持取消的接口还可以使用 AbortController 减少无用工作。

页面卸载或组件销毁时,待执行定时器也需要按生命周期清理。否则回调可能操作已经不存在的元素,或者把旧状态写回新页面,形成难以稳定复现的界面问题。

别遗漏这条边界

防抖不保证网络响应按顺序返回,仍需处理过期请求。

参考:JavaScript 文档。

搜索文章

输入关键词,找回一篇记录。