Как отправить сообщение от сервис-воркера на событие "message" экземпляра класса Workbox?
Это у меня в window.js...
const wb = new Workbox('sw.js');
wb.messageSW({type:'START'});
wb.addEventListener('message', e=>{
console.log(e);
});
... в моем sw.js у меня есть...
self.addEventListener('message', (e)=>{
if (e.data) {
switch(e.data.type) {
case 'START':
//do some processing here...
//...then how do I send a message to the client here so...
//...that it will be received by the wb.addEventListener('message',... in window.js?
break;
}
}
});
Я попытался отправить через MessagePort.postMessage() в e.ports[0], но это не сработало. Я чувствую, что это что-то базовое, особенно с использованием класса Workbox, но я просто не могу заставить его работать.
Мое последнее средство - использовать BroadcastChannel (с полифилом), но я сначала пробую это, поскольку для его работы может не понадобиться полифил.
1 ответ
Вы должны иметь возможность использовать следующее, чтобы отправить сообщение от работника службы всем WindowClient
s (т. е. один или несколько экземпляров вашего веб-приложения, которые могут открываться на нескольких вкладках):
const clients = await self.clients.matchAll({type: 'window'});
for (const client of clients) {
client.postMessage({...});
}
Этот призыв к client.postMessage({...})
должен запускать обработчик в вашем веб-приложении, который был зарегистрирован через wb.addEventListener('message', ...)
.