if ('serviceWorker' in navigator) {
console.log('Service Worker is supported');
navigator.serviceWorker.register('sw.js').then(function(reg) {
console.log(reg);
reg.pushManager.subscribe({
userVisibleOnly: true
}).then(function(sub) {
var endpoint = sub.endpoint;
console.log('endpoint:', sub.endpoint);
});
}).catch(function(err) {
console.log(':(', err);
});
}
这是我的serviceWorker注册的简单示例。当我第一次加载页面时,我收到错误:
未捕获(在承诺中)DOMException:订阅失败 - 没有活动的服务工作者
如果我重新加载此页面一切正常。在Mozilla我没有这个bug。 为什么serviceWorker不能在第一个onload中注册?
答案 0 :(得分:5)
要接收推送事件,您需要成功安装的服务工作者。您在成功安装服务工作者之前要求订阅,因此失败。否则,看起来你的推送订阅会有效,但如果唯一的工作人员无法安装,那么注册(以及你的订阅)就会被抛弃。
navigator.serviceWorker.ready
是一个承诺,一旦注册了活跃(成功安装)的工作人员就会解决。它通过注册解决,所以它在这里运作良好。
navigator.serviceWorker.ready.then(reg => reg.pushManager.subscribe(…))