2016-04-28 148 views
1
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注册示例。当我第一次加载页面时,出现错误:serviceworker第一次不加载

Uncaught (in promise) DOMException: Subscription failed - no active Service Worker

如果我重新加载此页面一切正常。在Mozilla中我没有这个错误。 为什么serviceWorker不能在第一个onload中注册?

回答

4

为了接收推送事件,您需要成功安装的服务人员。您在服务工作人员安装成功之前请求订阅,因此失败。否则,它会看起来像你的推送订阅工作,但如果唯一的工人无法安装,注册(并因此你的订阅)会被扔掉。

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

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

非常感谢,它帮助了我! =) –