fetch:超时、重试与 AbortController

发布时间:2026/10/8 1:09:56

fetch:超时、重试与 AbortController fetch是浏览器里发 HTTP 请求的标准方法。默认它不会因「等太久」自动失败也不会帮你重试。线上接口偶发超时、网关 503、限流 429若页面一直转圈或疯狂连打体验与服务都会受伤。下面把三件事拆开超时怎么取消、什么错误值得重试、怎么和 AbortController 配合。一、先说一个具体麻烦你写了constresawaitfetch(/api/report)constdataawaitres.json()上面代码中没有超时。服务端卡住时Promise 可能一直 pending按钮转个不停。用户重复点击又发出第二、第三次请求。需要两样能力1到点取消2区分「可重试」与「不该重试」避免把 400 校验错误也重打三遍二、AbortController取消的总闸AbortController提供一个signal。把它传给fetch调用abort()即可取消。constacnewAbortController()fetch(/api/report,{signal:ac.signal})// 某处ac.abort()上面代码中取消后fetch会以 AbortError 一类错误拒绝具体名称因环境略有差异。同一signal也可传给多个关联请求一并取消。超时只是「到时间自动 abort」的一种用法。三、最小超时封装思路A创建 controllerBsetTimeout到点 abortCfinally里清定时器。exportasyncfunctionfetchWithTimeout(url,options{},ms8000){constacnewAbortController()consttimersetTimeout(()ac.abort(),ms)try{returnawaitfetch(url,{...options,signal:ac.signal})}finally{clearTimeout(timer)}}上面代码中若调用方自己也传了signal生产代码还应把外部 abort 与超时 abort 合并例如AbortSignal.any或手动监听转发。入门先掌握「超时 定时 abort」。用户离开页面或关闭弹窗时同样应 abort避免无用请求占着连接与回调。四、什么错误才重试不是所有失败都该重试。通常更值得重试1网络断开、DNS 临时失败2408/429/502/503/5043你明确标成幂等的 GET / 某些可安全重放的写操作需业务保证通常不要盲着重试1400/401/403/404/422改请求或鉴权不是再打一次2非幂等 POST 已可能成功但响应丢失——重试可能造成重复下单需幂等键五、退避重试的最小形状「立刻再打」容易把服务打崩。常见做法是指数退避1s、2s、4s……并加一点抖动。asyncfunctionfetchWithRetry(url,options,{retries2,baseMs400}{}){letlastErrfor(leti0;iretries;i){try{constresawaitfetchWithTimeout(url,options,8000)if(res.ok)returnresif(![429,502,503,504].includes(res.status)||iretries)returnres}catch(err){lastErrerrif(iretries)throwerr}constwaitbaseMs*2**iMath.random()*100awaitnewPromise((r)setTimeout(r,wait))}throwlastErr}上面代码中逻辑是示意成功或不可重试状态码就返回可重试则等待后再来。真实项目还应1尊重Retry-After2把超时 abort 与「主动取消」区分开——用户取消不应再重试3对写操作加幂等键或禁止自动重试六、和 UI 状态机对齐请求层做好了还要和界面约定1进行中禁用提交或显示 loading2取消abort并忽略随后的过期响应3失败按状态码给文案401 去登录429 提示稍后再试竞态常见坑先发的慢请求后返回覆盖了新数据。用递增的 request id或每次新请求 abort 旧请求可以避免。七、常见误区1只await fetch不看res.okHTTP 404 不会进 catch需要自己判断。2所有方法统一重试三次非幂等写操作很危险。3超时时间设得极短又极多重试等于自己制造雪崩。4catch 到 AbortError 还弹「网络错误」用户主动取消应静默处理。5忘记清 timer组件卸载后仍 abort或 timer 泄漏。八、小结fetch本身不管超时与重试。用 AbortController 做取消用定时 abort 做超时用状态码与幂等性决定是否退避重试。三件事分开设计再组合混在一个「万能 request」里最容易变成黑盒。完
延伸阅读

更多相关文章

2026/10/6 18:54:09

电动汽车超快充技术解析:从800V高压平台到电池热管理设计

1. 从“里程焦虑”到“补能焦虑”:电动汽车的下一道坎作为一名在汽车行业摸爬滚打了十几年的老工程师,我亲眼见证了电动汽车从“政策玩具”到“市场主流”的惊人转变。早期,大家最关心的是“这车能跑多远?”,也就是我们…

2026/10/6 18:54:09

深信服防火墙小参数导致SuiDao无法建立与不通问题

某客户切换深信服防火墙,型号和接口数量和型号差不多,版本一模一样,切换后ipsec无附件建立成功1.防火墙vpn状态显示两端参数不一样2.再次检查替换前后防火墙参数一模一样。个人心理认为配置上没有可修改得地址。对端设备为阿里云公有云ipsec&…

2026/10/6 18:56:36

PrivScope:为混合AI智能体系统设计任务作用域信息泄露控制

1. 项目概述:当AI代理需要“守口如瓶”时最近在折腾一个混合智能体系统,遇到了一个挺有意思的难题:系统里有好几个AI代理,有的负责分析用户数据,有的负责调用外部API,还有的负责生成最终报告。它们之间需要…

2026/10/8 1:07:22

U2Net证件照抠图实战:从权重加载到批量生成

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 1:07:22

eFuse+STM32L432KC实现嵌入式电源路径保护设计方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 1:07:22

Java+MySQL局域网通信实战:从Socket到Netty的消息可靠性设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 1:07:22

Python OpenCV人脸识别实战:从源码跑通到参数调优避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 1:07:22

TPS259483与TM4C129协同构建工业级智能电源保护架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 1:02:21

TPS259483AYWPR与STM32F070RB协同实现工业级电源路径保护

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑