2016-04-24 66 views
1

在Chrome Mac上。我正在尝试注册ServiceWorker并为其设置一个变量。当我调用register()并且以前没有安装服务工作者时,“active”属性似乎立即设置为null,然后很快就会初始化(异步?)。ServiceWorkerRegistration.active未设置为第一次(Chrome)

var sw = null; 
navigator.serviceWorker.register('preview/sw.js', {scope: 'preview/'}). 
    then(function(registration) { 
     console.dir(registration); 
     sw = registration.active; 
     if (!sw) { 
      console.log('wat'); 
      console.dir(registration); 
     } 
    }); 

换句话说,我第一次安装服务人员时进入了if-block。控制台显示活动属性在console.dir()命令中设置为等于ServiceWorker,但sw变量为null。

刷新页面可修复问题。有人知道可能会造成这种情况吗?

回答

0

服务人员已注册,但它尚未激活,它尚未控制您的页面。

如果希望服务人员变为活动状态,则可以在install事件处理函数中调用skipWaiting函数。

如果希望服务工作人员在其变为活动状态时立即控制页面,则可以使用activate事件处理函数中的Clients.claim函数。

您可以在ServiceWorker Cookbook Immediate Claim recipe中看到一个示例。

3

对于您所描述的第一次访问,注册尚未active当该承诺解决但它是“正在安装”,因此注册的installing属性将返回一个服务工作者。

由于没有服务人员处于waiting状态,因此它将转换为activating,然后转换为active。所以你是对的,注册财产最初不是active但刷新,它会。

将下面的代码说明:

navigator.serviceWorker.register('/serviceworker.js').then(onRegistration); 

function onRegistration(registration) { 
    if (registration.waiting) { 
    console.log('waiting', registration.waiting); 
    registration.waiting.addEventListener('statechange', onStateChange('waiting')); 
    } 

    if (registration.installing) { 
    console.log('installing', registration.installing); 
    registration.installing.addEventListener('statechange', onStateChange('installing')); 
    } 

    if (registration.active) { 
    console.log('active', registration.active); 
    registration.active.addEventListener('statechange', onStateChange('active')); 
    } 
} 

function onStateChange(from) { 
    return function(e) { 
    console.log('statechange', from, 'to', e.target.state); 
    } 
} 

在第一次访问时,console.log输出将是:

installing ServiceWorker {scriptURL: "http://...", state: "installing", onstatechange: null, onerror: null} 
statechange initial state installing changed to installed 
statechange initial state installing changed to activating 
statechange initial state installing changed to activated 

,你观察到的状态的变化同步发生。