promise实现带失败自动重试的网络请求,核心是捕获错误、判断是否重试、延迟后递归调用自身;需控制重试次数与间隔,仅对5xx或网络错误重试,并支持abortcontroller超时与取消。

用 Promise 实现带失败自动重试的网络请求,核心是:捕获错误、判断是否重试、延迟后递归调用自身。关键在于控制重试次数、间隔时间和终止条件。
基础重试函数结构
封装 fetch 或其他请求方法,接收 URL、配置、最大重试次数和重试间隔(毫秒)作为参数。每次失败时,若还有剩余重试次数,就等待指定时间后再次发起请求。
- 用 Promise 包裹 fetch 调用,统一处理 resolve/reject
- catch 捕获错误后,检查重试次数是否耗尽
- 未耗尽则用 setTimeout + Promise.resolve().then() 延迟重试
- 避免直接递归调用导致栈溢出,推荐用 Promise 链式延迟
支持状态码判断的重试逻辑
不是所有错误都该重试——比如 401(未授权)或 404(不存在)通常无需重试,而 500、502、503、网络中断等才适合。可在 catch 中检查 response.status 或错误类型。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 若 fetch 成功但响应状态码异常(如 res.ok === false),手动 reject 并附带 status
- 在重试前判断:仅对特定状态码(如 5xx)或网络错误(TypeError)重试
- 示例:if (err instanceof TypeError || (res && res.status >= 500)) 才进入重试流程
可取消与超时控制
真实场景中需防止无限等待或用户切换页面后仍执行旧请求。可通过 AbortController 添加超时和取消能力。
- 每次重试都创建新的 AbortController,设置 timeout(如 8s)
- 将 signal 传入 fetch,超时触发 abort,抛出 DOMException
- 在重试前检查是否已 abort(如通过外部 flag 或 controller.signal.aborted)
- 注意:重试间隔 delay 不应计入总超时,每个请求单独计时
使用示例与调用方式
函数返回标准 Promise,可直接用 .then/.catch 或 await 调用,语义清晰且不破坏原有流程。
- fetchWithRetry('/api/data', { retries: 3, delay: 1000 })
- await fetchWithRetry('/api/user', { retries: 2, delay: 500, timeout: 5000 })
- 错误时最终 reject 的值包含原始错误、重试次数、最后一次响应(如有),便于上层分类处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










