2016-04-28 251 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

非常感謝,它幫助了我! =) –