后台脚本中的setInterval

时间:2013-08-08 21:17:11

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

我正在为实时产品开发浏览器扩展程序。我有一个后台页面,在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
  },

谢谢!

2 个答案:

答案 0 :(得分:5)

根据chrome文档,您应该使用alarms API代替。我不知道它是否会解决这个问题,但它确实值得尝试!

我引用:

  

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

     

http://developer.chrome.com/extensions/event_pages.html

=> http://developer.chrome.com/extensions/alarms.html

答案 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"

到目前为止,这对我来说效果不错,服务器没有丢弃事件。