WebExtensions 中 browser.alarms.create 与 setTimeout/setInterval 的区别是什么?

What differenciates browser.alarms.create from setTimeout/setInterval in WebExtensions?

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

现在,我们在 JavaScript 和 setTimeout and setInterval 中已经有这样一个功能很长时间了。那么这些有什么区别?为什么或在什么情况下我可能更喜欢一个而不是另一个?

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

引用自documentation on MDN

This is like setTimeout() and setInterval(), except that those functions don't work with background pages that are loaded on demand.

  • setTimeout/setInterval 时间跨度受限于 2^31-1 = 2147483647,即 ~24 天。小于 0 或大于 0 的值将转换为 int32 范围,这会产生意外结果。

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

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

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

除了已经发的,报警API好像比较靠谱:

  • if you setup alarm in the past, it will fire right away
  • if you setup future date and your PC wakes up from hibernation after the date, it will fire right after waking up
  • if you setup 8 hours from now, it will fire 8 hours from now (if your PC is on) no matter how long was your PC sleeping / hibernating in the meantime

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