搜索结果被旧响应覆盖
先理解原理和示例,再练习完整口述与追问。
回答要点
防抖限制触发;请求身份保证正确性;取消与结果隔离。
原理拆解
请求完成顺序由网络和服务端决定,不能用发送顺序推断。页面应把每个响应与产生它的条件和版本关联,只有当前版本拥有状态写入权。取消是资源优化,序号校验是结果正确性的保护,两者可以组合;loading 与错误也属于受保护状态。
示例与推演
时间线:id=1 请求 A → 切 id=2 请求 B → B 成功 → A 失败。若旧 catch 不校验版本,界面可能在正确数据上覆盖错误提示;旧 finally 也可能过早关闭新 loading。Vue 可把序号存实例或闭包,React 常用 ref;卸载时失效当前版本并清理请求。
易错点
不是只在成功分支加一次判断就完整。多个独立请求域要分别版本化,不能一个全局序号使互不相关的面板互相失效。
参考回答可直接练习口述
我会区分触发频率和结果竞争。防抖减少请求,但请求发出后仍可能乱序。每次查询生成递增 requestId,只有当前最新请求可以写列表、错误和 loading;旧请求可用 AbortController 取消,但即使取消不生效,结果标识仍能兜住正确性。组件卸载或条件清空时使旧请求失效。验证时让旧请求故意慢返回,检查新条件和加载状态始终一致。