我有以下设置。
SERVER(localhost / index.html)
<script type="text/javascript">
if('serviceWorker' in navigator){
// Register service worker
navigator.serviceWorker.register('service-worker.js').then(function(reg){
console.log("SW registration succeeded. Scope is "+reg.scope);
}).catch(function(err){
console.error("SW registration failed with error "+err);
});
}
</script>
客户(例如localhost / client1.html)
<script>
function send_message_to_sw(msg){
return new Promise(function(resolve, reject){
// Create a Message Channel
var msg_chan = new MessageChannel();
// Handler for recieving message reply from service worker
msg_chan.port1.onmessage = function(event){
if(event.data.error){
reject(event.data.error);
}else{
resolve(event.data);
}
};
// Send message to service worker along with port for reply
navigator.serviceWorker.controller.postMessage("Client 2 says '"+msg+"'", [msg_chan.port2]);
});
}
</script>
当客户关上窗户时,有没有办法让服务工作者知情?
答案 0 :(得分:0)
为beforeunload
或unload
事件添加事件侦听器是在关闭选项卡/窗口之前调度代码的标准方法。在窗口被销毁之前不保证执行异步代码,但这是你最好的选择。
但是,您不需要解释为什么让服务工作者知道关闭客户端窗口的原因。你应该花点时间考虑一下你的用例是否真的需要它。如果需要跟踪哪个客户端与哪些请求相关联,则可以使用fetch
事件处理程序中的FetchEvent.clientId
属性。如果您需要获取完整的客户列表,您可以通过clients.matchAll()
在服务人员中完成。