微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在清单 v3 Chrome 扩展程序中定期调用函数?

如何解决如何在清单 v3 Chrome 扩展程序中定期调用函数?

Service workers replace background pages in manifest v3 chrome extensions,我正在尝试为我的扩展使用一个。我需要能够定期运行一个函数it looks like alarms are the way to go。在示例中,他们建议在 Service Worker 的顶层执行此操作:

chrome.alarms.create({ delayInMinutes: 3.0 });

chrome.alarms.onAlarm.addListener(() => {
  chrome.action.setIcon({
    path: getRandomIconPath(),});
});

不过,据我所知,天气与我的服务工作者是否在事件之间被杀死是不确定的。我相信如果浏览器杀死了我的服务工作者,这将每 3 分钟调用一次,因为当脚本重新启动以处理警报时,它将再次运行第一行并排队另一个警报。

相比之下,如果浏览器让我的服务工作者在两次警报之间存活 3 分钟,这将不会循环,因为它只会调用 addListener() 一次,但会调用回调两次(第一次调用一次)最初生成此服务工作线程的警报,以及在此服务工作线程调用的第一行注册的警报)。 Service Worker 最终会死亡,并且不会再被闹钟唤醒。

我是否误解了事件在这里的运作方式?如果没有,我如何注册一次 chrome.alarms.create({ periodInMinutes: 3.0 }); 重复发生的警报,并避免每次重新启动 Service Worker 时都重新注册

注意:delayInMinutes 触发一次,periodInMinutes 重新触发。

解决方法

虽然它是不确定的,但规则非常简单,而且工作人员的行为几乎与 ManifestV2 的旧事件页面完全一样,主要点是:

  • 它在注册的 API 事件发生时唤醒
  • 它运行整个脚本,以便重新注册 API 侦听器
  • 它为唤醒它的 API 事件运行侦听器
  • 在最后一个 API 事件后 30 秒(MV2 中为 15 秒)后卸载;如果触发了另一个 API 事件,则卸载计时器将重新启动;如果 chrome.runtime 消息有一个开放端口,则计时器将延长五分钟,在 MV3 中,消息端口在五分钟后强制断开,而在 MV2 中,这些端口从不强制断开,从而使 MV2 事件页面保持活动状态。

现在回到那个演示脚本。你是对的:它依赖于非确定性行为。它就像扩展文档中的许多示例一样糟糕。使用 API 参考和开发工具调试器。

一个更现实的例子是只注册一次警报,例如在 chrome.runtime.onInstalled 事件中,因为浏览器内部会记住警报。另外,最好给它一个 id,以便我们可以检查它是否存在:

chrome.runtime.onInstalled.addListener(() => {
  chrome.alarms.get('periodic',a => {
    if (!a) chrome.alarms.create('periodic',{ periodInMinutes: 3.0 });
  });
});

chrome.alarms.onAlarm.addListener(() => {
  chrome.action.setIcon({
    path: getRandomIconPath(),});
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。