关于从后台持久扩展转换到非持久性事件页面的documentation,声明:
如果您的扩展使用window.setTimeout()或window.setInterval(),请转而使用警报API。如果事件页面关闭,基于DOM的计时器将不会受到尊重。
足够公平,但警报API documentation声明:
在"现在"之后可以设置为不到1分钟没有警告,但实际上不会导致警报至少1分钟。
所以,我在EventPage中有一个简短的setTimeout,需要5s,如果我不能在短时间内使用闹钟,我怎样才能确保它完成。 设置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
和朋友维持开放端口。我怀疑它比上述更有效率。