Service Worker 与客户沟通
Service worker communicate to clients
我一直在尝试从 service worker 向客户端发送消息,但是如果我使用
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'})
在 service worker 中
self.addEventListener('message', function(event) {
self.clients.fetchAll()
.then((clients) => {
clients.forEach(function(client) {
client.postMessage({msg: 'Hello from SW'})
})
})
})
它可以发送消息和寻找客户。
我做错了什么?我应该改用 indexedDB 吗?
我不相信 clients.fetchAll()
存在。您的意思可能是 clients.matchAll()
,这应该会给您描述的行为:
self.clients.matchAll().then(clients => {
clients.forEach(client => client.postMessage({msg: 'Hello from SW'}));
})
允许服务工作者与客户端通信,同时避免必须发送消息 one-by-one 的更好选择是 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);
});
添加 includeUncontrolled
选项应该:
for (const client of await clients.matchAll({includeUncontrolled: true, type: 'window'})) {
client.postMessage(message);
}
我一直在尝试从 service worker 向客户端发送消息,但是如果我使用
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'})
在 service worker 中
self.addEventListener('message', function(event) {
self.clients.fetchAll()
.then((clients) => {
clients.forEach(function(client) {
client.postMessage({msg: 'Hello from SW'})
})
})
})
它可以发送消息和寻找客户。 我做错了什么?我应该改用 indexedDB 吗?
我不相信 clients.fetchAll()
存在。您的意思可能是 clients.matchAll()
,这应该会给您描述的行为:
self.clients.matchAll().then(clients => {
clients.forEach(client => client.postMessage({msg: 'Hello from SW'}));
})
允许服务工作者与客户端通信,同时避免必须发送消息 one-by-one 的更好选择是 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);
});
添加 includeUncontrolled
选项应该:
for (const client of await clients.matchAll({includeUncontrolled: true, type: 'window'})) {
client.postMessage(message);
}