当前位置: 首页 > 知识库问答 >
问题:

Service Worker控制器永远不会开火

岳意蕴
2023-03-14

我想在每次加载页面时向服务人员发送一条消息。

第一次加载页面时,它调用寄存器(),然后侦听navigator.serviceWorker上的“控制器更改”事件,但这永远不会触发。

我如何知道何时可以开始发送邮件给服务人员?

navigator.serviceWorker.register(swURL).then(function(){
    var sw;

    if (navigator.serviceWorker.controller) {
        sw = navigator.serviceWorker.controller;
        sw.postMessage('ping');
        return;
    }

    function onchange(){
        sw = navigator.serviceWorker.controller;
        sw.postMessage('ping');
        navigator.serviceWorker.removeEventListener('controllerchange', onchange);
    }

    navigator.serviceWorker.addEventListener('controllerchange', onchange);
}).catch(function(err) {
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err);
});

共有2个答案

班思源
2023-03-14

它不触发的原因是,在服务人员已经安装/激活后,您正在注册controllerchange事件。因此,此事件将针对新的服务人员触发,例如使用skipWaiting()的人员。但不适用于最初的服务人员。

使用导航器。服务人员。就绪promise,无论何时安装/激活,只要检测到活动服务工作人员,就会立即解决。

司徒泰
2023-03-14

我如何知道何时可以开始发送邮件给服务人员?

只关注这一点:我推荐以下方法,它使用了navigator.serviceWorker.readypromise:

// navigator.serviceWorker.ready can be used from anywhere in your
// page's JavaScript, at any time.
// It will wait until there's an active service worker, 
// and then resolve with the service worker registration
navigator.serviceWorker.ready.then(registration => {
  registration.active.postMessage('ping');
});

如果您确实想了解为什么您的ControlerChange事件侦听器没有触发,我的猜测是您没有在服务工作者的激活事件中使用clients.claim(),这意味着新激活的服务辅助角色不会控制当前页面。

 类似资料:
  • 问题内容: 在我的控制器中,我从另一项服务中获得了承诺。我在其中添加了“ then”子句,但从未调用过“ then”。 看到这个矮人:http ://plnkr.co/edit/dX0Oz1?p=preview (javascript版本) “ fakeLongRunningPromise”会创建一个承诺,该承诺会在2秒后自动解决。 一旦履行了诺言,我便在控制器本身中向控制台发送了一条便条。 我可

  • 问题内容: 我正在开发游戏,但扫描仪遇到了一个小问题。我收到了一个从未关闭过的资源泄漏扫描程序。 但是我认为我的扫描仪在没有关闭之前就可以正常工作。但是现在不是。有人可以帮我吗? 问题答案: 我假设您正在使用Java 7,因此会收到编译器警告,当您不关闭资源时,通常应在finally块中关闭扫描程序。 甚至更好:使用新的 Try with resource语句 :

  • 问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。

  • 问题内容: 我正在使用Flask-WTF: 这是我的表格: 这是控制器: 现在的问题是,如果您查看我的打印语句,它将始终打印已提交的内容,但从不打印有效的内容,并且永远不会执行validate_on_submit()。为什么? 问题答案: 您没有在HTML表单中插入CSRF字段。 添加到模板(docs)后,表单将按预期验证。 验证表单后添加,以查看出现的错误。 在验证之前将为空。在这种情况下,会出

  • 1)我的plist配置提供背景模式: 2) 在中,我有: 3) 我在委托中声明了协议。 4)我实现了以下方法,但它永远不会被触发。(只有当我用“XCode-”模拟获取时才有效 为什么?这是DP5测试错误吗?我应该雷达这个吗?

  • 问题内容: 我正在尝试在OSX笔记本电脑上运行Jenkins的RF / Selenium2Library测试。默认情况下,Jenkins作为用户“ jenkins”安装。我已经安装了用于Jenkins的RF插件并设置了环境变量,除了浏览器从未打开(firefox或chrome)都无法正常运行,并且一切正常之外,测试都因selenium超时而失败,并指出此类元素从未出现。 我的直觉是,我需要在某个地