javascript 请求重试需监听 navigator.online 状态,用 online/offline 事件控制;失败请求入队暂存,离线时暂停重试、上线后遍历执行;配合 isnetworkavailable 标志与 settimeout 调度,增强健壮性。

在 JavaScript 请求重试逻辑中,离线时暂停重试、网络恢复后再继续,关键不是“强行重试”,而是监听网络状态变化,配合重试队列与状态控制来实现优雅暂停与恢复。
监听网络状态变化
利用 navigator.onLine 初始状态和 window.addEventListener('online') / 'offline' 事件,实时感知连接变化:
-
navigator.onLine返回true表示浏览器认为在线(注意:它不保证服务器可达,仅反映底层连接) - 注册
online事件,在恢复时触发待重试请求的检查或执行 - 注册
offline事件,在断开时暂停新重试、保留待办队列
维护可恢复的重试队列
不要让每个请求独立管理重试,而是统一调度。将失败请求(含 URL、参数、重试次数、延迟时间等)存入一个队列:
- 每次请求失败且需重试时,推入队列(避免重复添加)
- 离线时停止轮询/定时器,但不丢弃队列项
- 上线后遍历队列,对每项重新发起请求(可加防抖或节流,避免瞬间洪峰)
- 建议为每项绑定唯一 ID 或 hash,便于去重或取消特定请求
用标志位 + 定时器控制重试节奏
避免离线期间无效轮询。引入 isOnline 标志和可控的重试调度器:
- 定义全局
let isNetworkAvailable = navigator.onLine - 所有重试前先判断
if (!isNetworkAvailable) return - 重试使用
setTimeout而非setInterval,每次重试完成再决定是否安排下一次(更可控) - 上线后主动调用一次
processRetryQueue(),而不是等待下一个重试周期
补充健壮性细节
真实场景还需考虑边界情况:
- 页面隐藏(
visibilitychange)时可暂停重试,避免后台浪费资源 - 对长时间离线的请求,可设置最大挂起时间(如 10 分钟),超时后自动 reject 并清理
- 服务端返回 5xx 或超时,才进重试;4xx(如 401、404)通常不重试
- 可在
fetch或 axios 拦截器中统一注入该逻辑,避免每个请求手动处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











