serviceworker第一次不加载

时间:2016-04-28 13:29:40

标签: javascript service-worker

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中注册?

1 个答案:

答案 0 :(得分:5)

要接收推送事件,您需要成功安装的服务工作者。您在成功安装服务工作者之前要求订阅,因此失败。否则,看起来你的推送订阅会有效,但如果唯一的工作人员无法安装,那么注册(以及你的订阅)就会被抛弃。

navigator.serviceWorker.ready是一个承诺,一旦注册了活跃(成功安装)的工作人员就会解决。它通过注册解决,所以它在这里运作良好。

navigator.serviceWorker.ready.then(reg => reg.pushManager.subscribe(…))