3

我的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;
       }
   }
});

我尝试通过 e.ports[0] 中的 MessagePort.postMessage() 发送,但没有成功。我觉得这是基本的东西,尤其是使用 Workbox 类,但我就是无法让它工作。

我最后的手段是使用 BroadcastChannel(带有 polyfill),但我首先尝试这个,因为它可能不需要任何 polyfill 才能工作。

4

1 回答 1

4

您应该能够使用以下内容从 service worker 向所有WindowClients 发送消息(即您的 Web 应用程序的一个或多个实例,在可能的多个选项卡中打开):

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

该调用client.postMessage({...})应触发您的 Web 应用程序中通过wb.addEventListener('message', ...).

于 2019-09-23T20:49:00.227 回答