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
回调?
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。
我正在为浏览器创建一个 WebExtension。所以我发现了 the browser.alarms API。它基本上允许您设置一个(重复或一次性)警报,并且将触发一个回调。
现在,我们在 JavaScript 和 setTimeout
and setInterval
中已经有这样一个功能很长时间了。那么这些有什么区别?为什么或在什么情况下我可能更喜欢一个而不是另一个?
我的意思是主要区别很明显:您只能重新启动它,例如在几分钟内,而不是几秒钟。虽然,我认为使用 when
您也可以以毫秒精度注销和重新注册它,但我认为 API 可能用于更长的时间,即分钟。 (我只是在这里猜测。)
那么为什么我应该使用它而不是简单的 setInterval
/setTimeout
回调?
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。