使用 AbortController 取消重试请求的关键是:外部创建单个控制器并复用其 signal,每次 fetch 都传入该 signal;调用 abort() 即可中止所有未完成请求,且需检查 signal.aborted 避免无效重试。

用 AbortController 取消正在重试的请求,关键在于:每次重试都应使用新的 AbortSignal,且控制器(AbortController)必须在重试逻辑外部创建并统一管理——这样调用 abort() 才能真正中止所有未完成的请求。
重试时不能复用同一个 signal
如果在重试循环里每次都新建 AbortController,那之前发起的请求就失去控制权,abort() 对它们无效。正确做法是:在开始重试前创建一个控制器,把它的 signal 传给每次 fetch;后续任意时刻调用 controller.abort(),所有已发出、尚未响应的请求都会被浏览器终止。
封装带取消能力的重试函数
下面是一个实用的封装示例:
(支持手动取消、自动超时、指数退避)
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 用一个
AbortController实例贯穿整个重试过程 - 每次
fetch都传入controller.signal - 在
catch或setTimeout前检查signal.aborted,避免无意义重试 - 重试间隔用
Math.min(2 ** attempt * 1000, 30000)控制上限
实际调用与取消方式
调用后拿到返回的 promise 和 cancel 方法:
-
主动取消:执行
cancel(),内部调用controller.abort() -
超时取消:用
setTimeout(() => controller.abort(), timeoutMs) -
组件卸载时取消(如 React):在
useEffect清理函数中调用cancel()
注意 fetch 被取消后的错误类型
fetch 被 abort() 中止时,会抛出 DOMException,name === 'AbortError'。不要把它当作网络失败处理,而应静默忽略或明确提示“已取消”。

















