离线时提交的三条记录在恢复网络后只发出去一条,剩下两条一直留在队列里,IndexedDB 里能看到它们,界面上没有任何重试入口。日志里能对上时间点,这种反而好排。
同步回调里没有抛错,浏览器误以为任务已经完成,自然不会再安排重试。注册时每次都用新 tag,旧任务被覆盖,失败记录就成了孤岛。这一点先确认清楚,后面就不用反复试。
await reg.sync.register('outbox');
// 回调中:
if (!res.ok) throw new Error('retry');
await db.delete('outbox', id);
「Background Sync 重试」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:注册时固定 tag,同名任务会合并,别每次提交都新建一个;回调里失败就 throw,让浏览器感知失败并安排下一次重试;页面加载时补一次手动 flush,处理已经过期的队列。
结果对不对很好判断,断网提交三条后恢复网络,队列里的三条依次发完,IndexedDB 中对应记录被清空。
