javascript可通过localstorage/sessionstorage实现离线“先存后发”:在线时直接请求,离线时序列化请求参数(url、method、headers、body等)为任务对象并存储,网络恢复后监听online事件批量重试。

JavaScript 可以通过 localStorage 或 sessionStorage 暂存接口请求数据,实现离线时的“先存后发”逻辑。核心思路是:网络正常时直接请求;断网时把请求参数、方法、URL 等信息序列化存入本地存储,待网络恢复后再取出并重试。
判断网络状态并分流处理
用 navigator.onLine 快速判断当前是否在线(注意:它只反映浏览器层面的网络感知,不一定 100% 准确,建议配合请求失败兜底):
- 在线时,直接调用
fetch或axios发送请求 - 离线时,将请求配置(如
url、method、body、headers)打包成对象,用JSON.stringify存入localStorage - 为避免重复或覆盖,可用时间戳 + 随机 ID 作为 key,例如:
`offline-req-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
结构化存储请求任务
不要只存原始 body 字符串,应封装成可复用的任务对象:
- url:完整请求地址(含 query 参数)
- method:GET / POST / PUT / DELETE
-
headers:必需的 header(如
Content-Type、认证 token) -
body:字符串格式(POST/PUT 时需确保已
JSON.stringify;如果是表单数据,可用new URLSearchParams(formData).toString()) - timestamp:记录存入时间,便于后续按序重试或超时清理
示例:
const task = {
url: '/api/orders',
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer xxx' },
body: JSON.stringify({ item: 'book', qty: 2 }),
timestamp: Date.now()
};
localStorage.setItem(`offline-req-${id}`, JSON.stringify(task));
监听网络恢复并自动重发
利用 window.addEventListener('online') 监听上线事件,触发批量重试:
- 遍历
localStorage中所有以offline-req-开头的 key - 逐个解析、发起请求;成功后用
localStorage.removeItem(key)清除 - 失败时可保留任务、增加重试次数字段,或移入单独的失败队列做退避重试(如指数退避)
- 建议加防抖或节流,避免网络抖动频繁触发多次重试
补充健壮性细节
真实场景中还需考虑:
- 存储容量限制:localStorage 约 5–10MB,需定期清理过期/失败过多的任务(比如超过 24 小时未发送的)
- 敏感数据规避:避免在本地存储密码、token(除非加密)、银行卡等敏感字段;token 建议从内存或安全上下文获取
-
请求幂等性:后端接口最好支持幂等(如通过
Idempotency-Key请求头),防止重发导致重复下单等问题 - 用户提示:离线时给出明确反馈(如 toast 提示“已暂存,网络恢复后自动提交”),提升体验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











