闭包是实现函数受控重试逻辑的自然选择:它封装重试状态与控制逻辑,避免全局变量和重复传参;支持异步、错误判断、指数退避、取消/重置及轻量复用。

闭包是实现函数受控重试逻辑的自然选择:它能封装重试状态(如当前次数、最大次数、延迟时间)和控制逻辑(如是否继续、如何退避),让每次调用都“记住”上下文,而无需全局变量或重复传参。
封装重试配置与状态
用闭包把 最大重试次数、基础延迟、错误判断规则 等固定参数私有化,避免每次调用都显式传递。内部维护一个计数器,只在重试时递增,不污染外部作用域。
- 初始化时绑定 config(如 { maxRetries: 3, baseDelay: 100 })和待执行函数 fn
- 闭包返回的新函数自带 retryCount = 0,后续每次重试都在其内部更新
- 可选支持自定义 isRetryable(err) 判断哪些错误值得重试(如仅网络超时)
支持异步函数与 Promise 链式控制
现代重试逻辑多用于 fetch、API 调用等异步场景。闭包内统一处理 Promise 拒绝:捕获错误 → 判断是否可重试 → 决定等待后递归调用自身,或最终 reject。
- 使用 setTimeout 或更精确的 scheduler(如 queueMicrotask)控制延迟
- 延迟时间可按策略增长(如指数退避:delay = baseDelay * 2^retryCount)
- 递归调用保持 this 上下文和原始参数不变,可用 ...args 透传
暴露取消与重置能力
真实场景中常需中途终止重试(如用户离开页面)。可在闭包中返回带方法的对象,而非单纯函数:
- 返回 { execute: () => Promise, cancel: () => void, reset: () => void }
- cancel 方法标记 isCancelled = true,下次失败时直接 reject 不再重试
- reset 清零 retryCount,方便复用同一重试器多次发起请求
轻量组合与复用示例
你可以基于闭包快速构建不同语义的重试工具,比如:
- retryOnceOnNetworkError(fn) —— 封装 maxRetries=1 + 网络错误检测
- exponentialRetry(fn, { max: 5 }) —— 自动指数退避
- 与 React 的 useCallback 结合,确保重试函数不随渲染重复创建











