【问题标题】:Why service worker's message never gets to a client为什么服务人员的消息永远不会到达客户端
【发布时间】:2018-02-20 21:36:23
【问题描述】:

我正在尝试设置this example 并使其工作,但是在最简单的一个脚本文件和一个工作人员文件上它永远不会从服务工作人员向客户端发送消息。可能是什么问题?

浏览器:

谷歌浏览器 版本 64.0.3282.167(官方版本)(64 位)

main.js

navigator.serviceWorker.addEventListener('message', event => {
  console.log(event.data.msg, event.data.url);
});

navigator.serviceWorker.register("sw.js")
  .then(function (registration) {
    console.log("ServiceWorker registration successful with scope: ", registration.scope);
  })
  .catch(function (error) {
    console.error("Service Worker Error", error);
  });

sw.js

addEventListener('install', event => {
    event.waitUntil(self.skipWaiting());
});

addEventListener('activate', event => {
    event.waitUntil(self.clients.claim());
});

addEventListener('fetch', event => {
  event.waitUntil(async function() {
    // Exit early if we don't have access to the client.
    // Eg, if it's cross-origin.
    if (!event.clientId) return;

    // Get the client.
    const client = await clients.get(event.clientId);
    // Exit early if we don't get the client.
    // Eg, if it closed.
    if (!client) return;

    // Send a message to the client.
    client.postMessage({
      msg: "Hey I just got a fetch from you!",
      url: event.request.url
    });
  }());
});

我在每个地方都有console.log,并且正在调用方法client.postMessage

这适用于 Mozilla Firefox Quantum 58.0.2(64 位)

【问题讨论】:

  • 您的服务人员可能还没有控制页面 - 尝试声明它和/或跳过等待它。
  • 我试过了,但没用
  • @HenrikAndersson 我用它更新了 sw 代码
  • 您是否尝试过使用navigator.serviceWorker.controller.postMessage
  • 但我想从服务人员向客户发送消息,而不是相反

标签: javascript service-worker postmessage


【解决方案1】:

您必须先获取客户端对象。将此添加到您的 fetch 侦听器中。

self.clients.matchAll().then(function (clients){
    clients.forEach(function(client){
        client.postMessage({
            msg: "Hey I just got a fetch from you!",
            url: event.request.url
        });
    });
}); 

【讨论】:

  • 我正在使用此行通过 id await clients.get(event.clientId); 获取客户
  • 好的。我终于能够使用上面的代码将我的服务人员的消息传递到我的窗口。 ...如果你让你的工作以另一种方式,很好。以上对我有用。
  • 谢谢,我会在今天晚些时候下班后尝试一下,并将我的结果发布给你
  • 当 await clients.get 不起作用时,这对我有用
猜你喜欢
  • 2022-08-16
  • 1970-01-01
  • 2015-07-24
  • 2012-06-20
  • 2018-05-18
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多