用 AbortController 取消 fetch 请求,别再让旧数据覆盖新结果
在搜索框输入关键词时,每敲一个字符就发一次请求,往往前一个请求比后一个慢,最后渲染出来的却是旧关键词的结果。这个场景在管理后台的表格筛选、地图拖拽加载点位上反复出现。问题根源是 fetch 本身没有取消能力,请求一旦发出就会完整走完,而回调里又直接 setState,谁最后返回谁就覆盖。早期常用一个 flag 变量或 axios 的 CancelToken 来挡住旧响应,但前者只是忽略结果、请求仍在跑,后者已经停止维护。浏览器原生提供了 AbortController,配合 fetch 的 signal 参数可以真正中断连接,同时也能在组件卸载时清理副作用。这篇文章从实际搜索框的坑出发,整理 ...