Как отправить сообщение от сервис-воркера на событие "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 ответ

Вы должны иметь возможность использовать следующее, чтобы отправить сообщение от работника службы всем WindowClients (т. е. один или несколько экземпляров вашего веб-приложения, которые могут открываться на нескольких вкладках):

const clients = await self.clients.matchAll({type: 'window'});
for (const client of clients) {
  client.postMessage({...});
}

Этот призыв к client.postMessage({...}) должен запускать обработчик в вашем веб-приложении, который был зарегистрирован через wb.addEventListener('message', ...).

Другие вопросы по тегам