2016-10-20 5 views
1

Я хочу отправить сообщение сервисному работнику каждый раз, когда загружается страница.Service Worker controllerchange никогда не срабатывает

В первый раз, когда страница загружает вызовы register(), а затем прослушивает событие «changechange» на navigator.serviceWorker, но это никогда не срабатывает.

Как узнать, когда я смогу начать публикацию сервисного работника?

navigator.serviceWorker.register(swURL).then(function(){ 
    var sw; 

    if (navigator.serviceWorker.controller) { 
     sw = navigator.serviceWorker.controller; 
     sw.postMessage('ping'); 
     return; 
    } 

    function onchange(){ 
     sw = navigator.serviceWorker.controller; 
     sw.postMessage('ping'); 
     navigator.serviceWorker.removeEventListener('controllerchange', onchange); 
    } 

    navigator.serviceWorker.addEventListener('controllerchange', onchange); 
}).catch(function(err) { 
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err); 
}); 

ответ

1

Как я знаю, когда я могу начать postMessaging работника службы?

Просто сосредоточиться на том бит: Я бы рекомендовал следующий подход, который делает использование navigator.serviceWorker.ready обещание:

// navigator.serviceWorker.ready can be used from anywhere in your 
// page's JavaScript, at any time. 
// It will wait until there's an active service worker, and then resolve. 
navigator.serviceWorker.ready.then(registration => 
    registration.active.postMessage('ping'); 
}); 

Если вы хотите, чтобы добраться до сути, почему ваш слушатель controllerchange события я не думаю, что вы не используете clients.claim() в событии activate вашего рабочего, что означает, что вновь активированный сервисный работник не будет управлять текущей страницей.

Смежные вопросы