我目前正在学习如何使用后台同步来允许用户在离线使用网络应用程序时进行 PUT/POST 更改。
我按照杰克·阿奇博尔德 (Jake Archibald) 的指示进行操作后台同步简介 https://developers.google.com/web/updates/2015/12/background-sync,一切都很好......只要我在加载网络应用程序时注册后台同步online。我的意思是:
有效的步骤:
- 在线时我打开网络应用程序
- I turn 离线模式在网络选项卡中打开
- 我单击一些注册后台同步的按钮。
- I turn 离线模式关闭,因此应用程序重新上线。
- 触发后台同步。
导致其停止工作的步骤:
即使在上述情况下,如果我执行以下操作,它也会完全停止工作:
- 在另一个网站上时,我转向离线模式在网络选项卡中打开。
- 我导航到我的网络应用程序,由于服务人员的帮助,该应用程序可以离线使用。
- 我单击一些应该注册后台同步的按钮。
- I turn 离线模式在网络选项卡中关闭。
- 什么都没发生。
- 在我转到“应用程序”选项卡并取消注册服务工作人员并从全新安装中重试后,第一个步骤有效,但第二组步骤不断破坏后台同步
Code:
In page:
//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() )
}
});
Update
当代码工作时,我使用以下代码来跟踪发送到注册的标签:
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
不再了。无论我做什么,比如关闭浏览器选项卡、在线时刷新页面、等待一段时间,Service Worker 就是不会listen
不再同步事件。
我知道这由浏览器决定何时进行后台同步,但我只是不明白为什么这不起作用。除非预期的行为是期望用户在线时访问网络应用程序,否则我认为我遇到了问题。
感谢您的耐心等待,如果您能帮助了解如何使后台同步工作,我们将不胜感激。