Javascript navigator.serviceWorker.controller在页面刷新之前为空
我与angularjs合作,并使用服务工作者接收推送通知。 但是navigator.serviceWorker.controller在页面刷新之前是空的,我不知道如何解决这个问题 serviceworker的某些代码:Javascript navigator.serviceWorker.controller在页面刷新之前为空,javascript,angularjs,service-worker,Javascript,Angularjs,Service Worker,我与angularjs合作,并使用服务工作者接收推送通知。 但是navigator.serviceWorker.controller在页面刷新之前是空的,我不知道如何解决这个问题 serviceworker的某些代码: self.addEventListener('push', pwServiceWorker.pushReceived); self.addEventListener('notificationclick', pwServiceWorker.notificationClicked)
self.addEventListener('push', pwServiceWorker.pushReceived);
self.addEventListener('notificationclick', pwServiceWorker.notificationClicked);
// refresh caches
self.addEventListener('activate', function (event)
{
event.waitUntil(
caches.keys().then(function (cacheNames)
{
return Promise.all(
cacheNames.map(function (cacheName)
{
return caches.delete(cacheName);
})
);
})
);
});
并在接收到推送时向serviceworker中的客户端发送消息:
self.clients.matchAll().then(function(all) {
console.log(all);
all.forEach(function(client) {
client.postMessage(data);
});
});
在mainController.js中,给出如下消息:
if (!navigator.serviceWorker || !navigator.serviceWorker.register) {
console.log("This browser doesn't support service workers");
return;
}
// Listen to messages from service workers.
navigator.serviceWorker.addEventListener('message', function(event) {
console.log("Got reply from service worker: " + event.data);
});
// Are we being controlled?
if (navigator.serviceWorker.controller) {
// Yes, send our controller a message.
console.log("Sending 'hi' to controller");
navigator.serviceWorker.controller.postMessage("hi");
} else {
// No, register a service worker to control pages like us.
// Note that it won't control this instance of this page, it only takes effect
// for pages in its scope loaded *after* it's installed.
navigator.serviceWorker.register("service-worker.js")
.then(function(registration) {
console.log("Service worker registered, scope: " + registration.scope);
console.log("Refresh the page to talk to it.");
// If we want to, we might do `location.reload();` so that we'd be controlled by it
})
.catch(function(error) {
console.log("Service worker registration failed: " + error.message);
});
}
这是预期的行为。要在不等待刷新/重新打开的情况下控制所有打开的页面,您必须向服务人员添加以下命令:
self.addEventListener('install', function(event) {
event.waitUntil(self.skipWaiting()); // Activate worker immediately
});
self.addEventListener('activate', function(event) {
event.waitUntil(self.clients.claim()); // Become available to all pages
});
您可以在docs和docs中阅读更多关于它们的信息。确保您的服务人员的范围包括有问题的url。发布一些代码,否则没有人可以帮助您。这些
事件可能重复。Waitunt(…
函数将添加到缓存函数之外(请参阅原始问题)或者替换它们?如果替换它们,它们什么时候会被使用?这将它们用作回调,这对我来说非常有效。我要注意的另一点是,a和窗口将不受控制!我的service worker和navigator.serviceWorker.controller中的这些行在重新加载页面之前仍然为空。必须有其他一些t他也需要这样做