刚敲下第一个字母,网络面板就多出一条搜索请求,打完一个三字词组累计发出七八次,服务端日志里全是半截词。乍看像缓存或者权限的锅,追下去往往不是。
let timer;
input.addEventListener('input', () => {
clearTimeout(timer);
timer = setTimeout(runSearch, 300);
});
追下去是这么回事:每次输入事件都直接发起请求,既没有延迟合并,也没设最小字数,回车之前的每次改动都算一次独立查询,白白消耗后端。
「搜索防抖最小长度」这类改动最怕改一半,回滚脚本先准备好,再动生产。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,输入事件里加三百毫秒延迟,把连续敲击合并成一次;少于两个字直接不发请求,等用户再敲一个字符;只采用最后一次请求的返回,先回来的旧结果直接丢弃。
验收就看一点,连续输入一个词组只发一次请求,单字输入不再触发查询,结果也不再闪。
