我目前正在学习如何使用后台同步来允许用户在离线使用 Web 应用程序时进行 PUT/POST 更改。
我按照 Jake Archibald 在 Introducing Background Sync中给出的说明进行操作,一切都很好......只要我在在线加载网络应用程序时注册了 Background Sync 。我的意思是:
有效的步骤:
- 在线时我打开网络应用程序
- 我在网络选项卡中打开离线模式
- 我单击了一些注册后台同步的按钮。
- 我关闭了离线模式,所以应用程序重新上线。
- 触发后台同步。
导致它停止工作的步骤:
即使在上述情况下,如果我执行以下操作,它也会完全停止工作:
- 在另一个站点上时,我在网络选项卡中打开了离线模式。
- 我导航到我的网络应用程序,感谢服务人员,该应用程序可以离线使用。
- 我单击了一些应该注册后台同步的按钮。
- 我在网络选项卡中关闭了离线模式。
- 什么都没发生。
- 在我转到“应用程序”选项卡并取消注册服务工作者并从全新安装重试后,第一步有效,但第二组步骤不断破坏后台同步
代码:
在页面中:
//requesting a one-off sync:
navigator.serviceWorker.ready.then(function (reg) {
return reg.sync.register('sync-tag');
}).catch(function (e) {
console.error(e, "System was unable to register for a sync");
});
在服务工作者
self.addEventListener('sync', event => {
if (event.tag == 'sync-tag') {
event.waitUntil( doStuff() )
}
});
更新
当代码工作时,我使用以下代码来跟踪发送到注册的标签:
navigator.serviceWorker.ready.then(function (reg) {
console.log('before', reg.sync.getTags());
reg.sync.register('sync-tag');
console.log('after', reg.sync.getTags());
}).catch(function (e) {
console.error(e, "System was unable to register for a sync");
});
当使用有效的步骤时,我得到
before: resolved to an empty array
after: resolved to an array with one tag ['sync-tag']
使用导致其停止工作的步骤时:
before: resolved to an array with one tag ['sync-tag']
after: resolved to the same array above
这让我相信同步注册发生了,但服务工作者listening
不再存在。而且无论我做什么,比如关闭浏览器选项卡,在线刷新页面,等待一段时间,服务工作者都不会listen
再同步事件了。
我知道这取决于浏览器来决定何时进行后台同步,但我只是不明白为什么这不起作用。除非预期的行为是期望用户在线时访问网络应用程序,否则我认为我做错了。
感谢您的耐心等待,我们将不胜感激任何理解如何使后台同步工作的帮助。