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

时间:2015-12-14 16:13:41

标签: javascript google-chrome google-chrome-extension

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

  

如果您的扩展使用window.setTimeout()或window.setInterval(),请转而使用警报API。如果事件页面关闭,基于DOM的计时器将不会受到尊重。

足够公平,但警报API documentation声明:

  

在"现在"之后可以设置为不到1分钟没有警告,但实际上不会导致警报至少1分钟。

所以,我在EventPage中有一个简短的setTimeout,需要5s,如果我不能在短时间内使用闹钟,我怎样才能确保它完成。 设置1分钟长的闹钟不适合我。

1 个答案:

答案 0 :(得分:4)

如果你需要经常做这样的事情,那么wOxxOm是绝对正确的:事件页面是一种不好的方法来满足你的需求

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

频繁的计时器不属于这一类。毕竟,"旋转"事件页面经常是相当大的资源/性能损失,而不是始终保持准备状态。

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

然后目标就变成了#34;忙碌"足够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
}

这是一种非常稀疏的&#34;忙碌等待,不应该消耗太多资源 - 再次,如果不经常使用的话。

其他灵魂可能包括通过chrome.runtime.connect和朋友维持开放端口。我怀疑它比上述更有效率。