在 async/await 中实现错误重试需用 while 循环+try/catch 控制流程,封装 retry 高阶函数支持配置次数、延迟、错误类型过滤及指数退避,避免盲目重试。

在 async/await 中实现错误重试,核心是把异步操作包裹进循环,捕获异常并控制重试次数与间隔,而不是依赖 try/catch 一次就结束。
用 while 循环 + try/catch 控制重试流程
避免在 await 外层直接 throw,而是让重试逻辑自己决定是否继续。关键点:定义最大重试次数、当前尝试计数、失败后延迟再试。
- 每次 try 中执行 await 的异步操作(如 fetch、API 调用)
- catch 捕获错误后,判断是否还能重试;不能则 rethrow,能则等待后继续循环
- 使用 await new Promise(resolve => setTimeout(resolve, delay)) 实现等待
封装可复用的 retry 函数
把重试逻辑抽成高阶函数,接收异步操作和配置,提升复用性与可读性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 参数包括:要执行的 async 函数(fn)、最大重试次数(times)、每次延迟毫秒数(delay)
- 内部用递归或循环实现,推荐递归写法更简洁(注意栈深度,一般 ≤10 次安全)
- 示例:retry(() => fetch('/api/data'), { times: 3, delay: 1000 })
区分错误类型,避免盲目重试
不是所有错误都适合重试。比如 401(未授权)或 400(参数错误)重试无意义,而网络超时或 503 更适合。
- 在 catch 中检查 error.name、response.status 或自定义错误码
- 对特定错误(如 TypeError、AbortError、status ≥ 500)才重试
- 可配合 abortController 防止某次请求卡死影响整体重试节奏
加入指数退避,减少服务压力
连续快速重试可能加重后端负担。简单做法是让 delay 随重试次数增长(如 delay *= 2)。
- 初始 delay 设为 100ms,第二次 200ms,第三次 400ms……
- 可加随机抖动(如 × (0.5–1.5)),避免大量客户端同步重试
- 注意不要超过合理上限(如最大 5 秒),防止用户长时间等待
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










