2017-02-09 10 views
0

Я пытался отправлять сообщения клиентов из службы работника, но если я используюслужба работников общаются с клиентами

self.clients.matchAll() 
.then((clients) => { 
    clients.forEach(function(client) { 
    client.postMessage({msg: 'Hello from SW'}) 
    }) 
}) 

он не будет посылать любой клиенту, даже если у меня есть вкладка открыта в браузере, но если я посылаю сообщение от клиента к службы работника

// client 
navigator.serviceWorker.controller.postMessage({title: 'Send message from client'}) 

и работника службы

self.addEventListener('message', function(event) { 
    self.clients.fetchAll() 
    .then((clients) => { 
     clients.forEach(function(client) { 
     client.postMessage({msg: 'Hello from SW'}) 
    }) 
    }) 
}) 

он может отправить сообщение и находит клиентов. что я делаю неправильно ?, вместо этого я должен использовать indexedDB?

ответ

1

Я не считаю, что clients.fetchAll() существует. Вы, вероятно, означает clients.matchAll(), что должно дать вам поведение вы описываете:

self.clients.matchAll().then(clients => { 
    clients.forEach(client => client.postMessage({msg: 'Hello from SW'})); 
}) 

приятнее альтернатива позволяет работнику службы общаться с клиентами, избегая при необходимости отправки сообщений один за другим, является make use of the Broadcast Channel API. Он теперь поддерживается в последних версиях Chrome, а также в Firefox.

// From service-worker.js: 
const channel = new BroadcastChannel('sw-messages'); 
channel.postMessage({title: 'Hello from SW'}); 

// From your client pages: 
const channel = new BroadcastChannel('sw-messages'); 
channel.addEventListener('message', event => { 
    console.log('Received', event.data); 
}); 
+0

Вы правы в отношении self.clients.matchAll, я использовал это, API канала Broadcast работает очень хорошо. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^