列表切到第二页时,先发的第一页请求晚回 800ms,页面显示第一页数据但页码是 2。快速点五次筛选,最终内容对不上最后一次条件。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,每个请求各自 setState,没有取消上一个,谁最后返回谁覆盖。页码是同步更新的,数据和页码来自两次不同的请求。

「AbortController 取消请求」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。报错里带路径的,先去看那个路径在不在、权限对不对。

useEffect(() => {
  const ac = new AbortController();
  fetchList(page, { signal: ac.signal }).then(setList);
  return () => ac.abort();
}, [page, keyword]);

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,在 effect 里创建 AbortController 清理时 abort;请求函数把 signal 传给 fetch;catch 里忽略 AbortError 不要弹错;连续切五次筛选 核对最终结果与最后一次条件。

最后用这个标准收尾,连续快速切换五次,列表内容始终对应最后一次筛选,Network 里前几条显示 canceled。

作者 9823189