Как отправить сообщение от сервисного работника на событие «сообщения» экземпляра класса Workbox? - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть это в моем 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 Ответ

0 голосов
/ 23 сентября 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...