我正在为实时产品开发浏览器扩展程序。我有一个后台页面,在manifest.json中设置了“persistent:true”(我使用的是版本v2)。我每隔一秒使用setInterval()轮询服务器以获取新数据。后台脚本还会缓存到目前为止收集的数据,并将其提供给任何新打开的选项卡。
事情很好,直到有时我注意到当我让电脑长时间睡眠时,我对服务器的调查就停止了!如果我刷新了任何现有选项卡,我确实看到了缓存数据。这意味着,后台页面未被Chrome杀死。我的问题是,为什么chrome只是停止setInterval()调用?此外,如果由于某种原因停止轮询,恢复民意调查的正确方法是什么?
//relevant part of manifest.json
"background": {
"scripts": [
"js/background/jquery.min.js",
"js/background/bgconfig.js",
"js/background/backgroundmanager.js",
"js/background/eventsfetcher.js"
],
"persistent": true
},
谢谢!
答案 0 :(得分:5)
根据chrome文档,您应该使用alarms API代替。我不知道它是否会解决这个问题,但它确实值得尝试!
我引用:
如果您的扩展使用window.setTimeout()或window.setInterval(),请转而使用警报API。如果事件页面关闭,则不会遵守基于DOM的计时器。
答案 1 :(得分:1)
对于其他寻找解决方案的人,我最终实现了@Pluto的建议:
"Store the intervalID returned from setInterval in a global variable, then when the window gains focus again, clear that interval and run setInterval again"
到目前为止,这对我来说效果不错,服务器没有丢弃事件。