如何替换事件页面扩展中的短(不到一分钟)setTimeouts

How to replace short (less than a minute) setTimeouts in Event Page Extensions

本文关键字:setTimeouts 一分钟 何替换 替换 事件 扩展      更新时间:2023-09-26

关于从后台持久扩展转换到非持久事件页面的文档,声明:

如果扩展使用window.setTimeout()或window.setInterval(),请改用报警API。如果事件页面关闭,基于DOM的计时器将不会被使用。

很公平,但警告API文件指出:

当可以在没有警告的情况下设置为"现在"后不到1分钟,但实际不会导致警报器启动至少1分钟。

所以,我的EventPage中有一个短的setTimeout,它需要5秒,如果我不能在短时间内使用闹钟,我如何确保它完成。设置1分钟长的警报对我来说不是一个解决方案。

如果您需要经常这样做,那么wOxxOm是绝对正确的:事件页面不适合您的需求

文档不应被误解:持久的背景页不会以任何方式被否决。对于不规则和/或很少处理事情的后台页面,事件页面是一种更有效的解决方案。

常客不属于这一类。毕竟,频繁"旋转"事件页面是一种相当大的资源/性能损失,而不是让它随时准备好。


现在,当您只需要将此超时作为不频繁(而不是常规)操作的一部分时,问题变得更加棘手,因为您认为这些操作之间的长时间暂停可以从事件页面模型中受益。这是可能发生的!

然后,目标变成对Chrome来说足够"繁忙",这样就不会关闭事件页面。

可能最简单的方法是更频繁地调用计时器,因为事件页面可以保证持续几秒钟:

var SAFE_DELAY = 1000; // Guaranteed not to fall asleep in this interval
function setBusyTimeout(callback, delay) {
  if(delay <= SAFE_DELAY) {
    setTimeout(callback, delay);
  } else {
    var start = Date.now(); // setTimeout drifts, this prevents accumulation
    setTimeout(
      function() {
        setBusyTimeout(callback, delay - (Date.now() - start));
      }, SAFE_DELAY
    );
  }
  // Can be expanded to be cancellable by maintaining a mapping
  //   of "busy timeout IDs" to real timeoutIds
}

这是一种非常"稀疏"的繁忙等待,不应该消耗太多资源——同样,如果不经常使用的话。

其他灵魂可能包括通过chrome.runtime.connect和朋友保持开放端口。我怀疑它是否比上面的CPU效率更高。