serviceworker 第一次没有加载

serviceworker does not load the first time

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的简单例子。当我第一次加载页面时,出现错误:

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

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

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

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

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