Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 背景脚本中的setInteval_Javascript_Google Chrome_Google Chrome Extension_Setinterval - Fatal编程技术网

Javascript 背景脚本中的setInteval

Javascript 背景脚本中的setInteval,javascript,google-chrome,google-chrome-extension,setinterval,Javascript,Google Chrome,Google Chrome Extension,Setinterval,我正在为一个实时产品开发一个浏览器扩展。我有一个在manifest.json中设置了“persistent:true”的背景页面(我使用的是v2版本)。我使用setInterval()每秒不断轮询服务器以获取新数据。后台脚本还缓存它收集到的数据,并将其提供给任何新打开的选项卡 一切正常,直到有时我注意到,当我让电脑长时间处于睡眠状态时,我对服务器的轮询就停止了!如果我刷新了任何现有选项卡,就会看到缓存的数据。这意味着,背景页面没有被Chrome杀死。我的问题是,为什么chrome只是停止setI

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

谢谢

根据chrome文档,您应该使用。我不知道它是否能解决问题,但绝对值得一试

我引述:

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


=>

对于其他寻找解决方案的人,我最终实现了@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"

到目前为止,这对我来说效果很好,没有从服务器删除任何事件。

Chrome没有停止它。您的操作系统是。@TravisJ:谢谢,但恢复它的最佳方式是什么?将从
setInterval
返回的intervalID存储在全局变量中,然后当窗口再次获得焦点时,清除该间隔并再次运行
setInterval
。似乎真的没有办法检查间隔是否仍在运行,所以这就是为什么我建议这样做。这里有一个关于检查窗口是否获得焦点的链接:@Pluto:这是我最后的选择,但似乎我不得不这么做。谢谢你的帮助!实时的?您是否考虑过使用WebSocket来减少网络负载?如果没有,至少使用API来检测用户是否离开,以便在用户不在时节省资源感谢但alarms API只允许我以分钟为间隔创建警报,我需要至少每秒轮询一次。正如我看到的,间隔被定义为双精度:您是否尝试在其中添加分数?“为了减少用户机器上的负载,Chrome将警报限制为最多每1分钟一次,但可能会延迟任意数量的警报。”真正的问题是为什么OP需要每秒轮询一次服务器。适用于事件页面,但它是一个背景页面,而不是持久:true。