后台同步 api 仅在网络恢复时触发一次通知,真正重发依赖自建缓存+重试闭环;必须用 indexeddb 持久化请求数据,提取 url、方法、headers、序列化请求体并存唯一 id、时间戳、状态及过期时间;注册需用户交互且 sw 已激活;sw 中需用 event.waituntil 处理 sync,查库、发请求、更新状态,并确保接口幂等;需提供离线提交反馈、同步结果通知、待同步数量提示及手动重试入口。

后台同步 API(Background Sync)本身不重发数据,它只在网络恢复时触发一次“该干活了”的通知。真正保证离线数据重发的,是你自己设计的缓存+重试闭环——API只是那个可靠的唤醒开关。
必须用 IndexedDB 持久化请求数据
断网时用户提交的数据不能只存在内存或 localStorage 里,更不能直接存原始 Request 对象(它不可序列化)。你需要在主线程中立刻提取关键字段并存入 IndexedDB:
- URL、HTTP 方法(POST/PUT)、必要 headers(如 Content-Type)
- 请求体:JSON 字符串、base64 编码、或 ArrayBuffer(文件需提前用
FileReader转换) - 添加唯一 ID、时间戳和状态字段(如
status: 'pending') - 建议加过期时间(例如 7 天),避免长期积压失效数据
注册 sync 任务要守用户交互和环境规则
注册不是随时能调,浏览器有明确限制:
- 只能在用户真实操作后注册,比如点击「提交」按钮或触发表单 submit 事件
- 必须确保 Service Worker 已激活,且页面运行在 HTTPS 或 localhost 环境
- 用
try/catch包裹注册逻辑,捕获InvalidStateError(SW 未就绪)或NotAllowedError(无用户交互) - 同一 tag 重复注册会被忽略,但建议用带业务标识的名称,如
'submit-order-v2'
在 Service Worker 中完整处理 sync 事件
收到 sync 事件不等于任务完成,你得自己读库、发请求、判结果、清记录:
- 用
event.waitUntil(promise)包裹整个流程,防止 SW 被系统终止 - 先查 IndexedDB 中
status = 'pending'的记录,按时间或重试次数排序 - 逐条 fetch:成功则更新 DB 状态为
'synced'并删记录;失败则更新retryCount,超阈值(如 5 次)设为'failed' - 服务端接口必须支持幂等(例如前端传
request-id,后端做去重),否则重试会生成重复订单或消息
给用户可感知的真实反馈
后台同步对用户是隐形的,但体验不能是黑盒:
- 提交后立即显示“已加入离线队列”,而不是“提交成功”
- 通过
postMessage把同步结果(成功/失败/跳过)传回页面,更新 UI 状态 - 页面加载时可主动询问 Service Worker 当前待同步数量,用小红点或横幅提醒
- 关键操作失败后,提供手动重试入口,别只靠后台默默循环
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











