
7.9 上传进度与请求取消
fetch 没有原生上传进度(要用 XMLHttpRequest 或手动消费 ReadableStream),取消请求用 AbortController(XHR 用 xhr.abort());大文件要分片上传(并发 + 断点续传 + 秒传)。

fetch 没有原生上传进度(要用 XMLHttpRequest 或手动消费 ReadableStream),取消请求用 AbortController(XHR 用 xhr.abort());大文件要分片上传(并发 + 断点续传 + 秒传)。

实时数据有四种方案——轮询(简单但浪费)、SSE(服务端单向推送,浏览器自动重连)、WebSocket(双向、需要自己做心跳与重连)、长轮询(兼容性最好但服务器压力大);选择依据是「是否需要双向 + 实时性要求 + 基础设施成本」。

压缩、裁剪、加水印、抠图、拼接都在本地完成。不限张数、不限次数,图片不会传到服务器。

分页有「页码分页」与「游标分页(cursor)」两类;列表页用 useInfiniteQuery + IntersectionObserver 做无限滚动最省事,而返回列表时恢复滚动位置是体验的关键细节。

乐观更新是「在请求返回之前先假设它会成功、立刻更新界面」,失败时再回滚——它显著提升「操作手感」,但只适合「大概率成功、可回滚」的操作。

缓存的核心是「这份数据什么时候算新鲜、什么时候该重新拉、没人用的时候什么时候回收」——对应 staleTime(新鲜期)、失效(invalidateQueries)与 gcTime(回收时间);重试则要「只重试值得重试的错误」。

服务端状态是「别人拥有的数据的本地快照」,它需要「缓存、去重、失效、重试、重新验证」——这些用 useEffect 手写会写出一堆样板,所以应该交给 TanStack Query / SWR。

异步 UI 有四种状态(idle / loading / success / error,通常还加 empty)——用状态机建模(而不是多个布尔值),并为每种状态设计明确、不闪烁的 UI。

竞态(race condition)指「多个并发请求,后发起的先返回,导致旧数据覆盖新数据」;解法是「取消(AbortController)或忽略(标记位)」,并且StrictMode 下的双执行会暴露这个问题。

fetch 是浏览器原生 API(体积为零、但不会因 4xx/5xx 报错、无超时、需手动解析),axios 是功能完备的库(拦截器、超时、自动 JSON、进度);实际项目里两者都需要一层统一封装。
最新评论
读过书不知道欧·亨利的人少。教科书上选文有
这小生活不错呀
不错,必须顶一下!
看着你还在坚持,很好
看来忙了也没时间更新博客了
NIce。学习了。。。。
网站不错!!!!
简洁实用,好文章!