【问题标题】:What differenciates browser.alarms.create from setTimeout/setInterval in WebExtensions?WebExtensions 中的 browser.alarms.create 与 setTimeout/setInterval 有何区别?
【发布时间】:2019-04-14 11:16:46
【问题描述】:

我正在为浏览器创建一个 WebExtension。所以我发现了the browser.alarms API。它基本上允许您设置(重复发生或一次性)警报,并且将触发回调。

现在,我们已经在 J​​avaScript 中拥有这样的功能很长时间了,就像在 setTimeoutsetInterval 中一样。那么与这些有什么区别?为什么或在什么情况下我可能会更喜欢一个而不是另一个

我的意思是主要区别很明显:您只能重新启动它,例如在几分钟内,而不是几秒钟。虽然,我认为when 您也可以取消注册并以毫秒精度重新注册它,但我认为 API 可能适用于更长的时间,即几分钟。 (我只是在这里猜测。) 那么我为什么要使用它而不是简单的setInterval/setTimeout 回调呢?

【问题讨论】:

  • 可能警报在浏览器会话中持续存在。
  • @Emissary 我对此表示怀疑,因为这将严格违背大多数 WebExtension API 在您例如更新插件或重启浏览器。

标签: javascript google-chrome-extension firefox-addon firefox-addon-webextensions add-on


【解决方案1】:

引用documentation on MDN

这类似于 setTimeout() 和 setInterval(),只是这些函数不适用于按需加载的背景页面。

【讨论】:

    【解决方案2】:
    • setTimeout/setInterval 时间跨度受 2^31-1 = 2147483647 即约 24 天的限制。小于 0 或大于该值的值会被强制转换为 int32 范围,这可能会产生意想不到的结果。

    • setTimeout/setInterval 是标准 DOM 的一部分,而不是 isolated world,因此当您在内容脚本中使用它时,网页脚本可能会通过 clearTimeout/clearInterval 意外清除它们。
      解决方法:向后台脚本发布一条消息,以便它设置计时器并在完成后发送响应。

    • Event pages(那些在 manifest.json 中有 "persistent": false 的那些)不会等待 setTimeout / setInterval 由于不活动而在卸载之前,并且不会为这样的计时器唤醒,因此您只能使用它们很短的时间(目前活动页面保证存活 5 秒)。

    在这些指定的限制内,您可以安全地使用 setTimeout/setInterval。

    【讨论】:

      【解决方案3】:

      除了已经贴出来的,报警API好像更靠谱:

      • 如果您在过去设置了警报,它会立即触发
      • 如果您设置了未来的日期并且您的电脑在该日期之后从休眠状态中唤醒,它会在唤醒后立即启动
      • 如果您设置 8 小时后,无论您的 PC 在此期间睡眠/休眠多长时间,它都会在 8 小时后触发(如果您的 PC 处于开启状态)

      请参阅 https://discourse.mozilla.org/t/how-reliable-are-alarms/40978/8?u=rugkx,感谢来自 Mozilla 社区的 Juraj Masiar

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        相关资源
        最近更新 更多