2014-05-18 1267 views
27

我在Stack Overflow和Google搜索了标题中的特定错误消息,但没有找到它(在JavaScript编码的上下文中,而不是浏览器设置)。在我的网站上,有五个函数每10秒调用一次。这些功能做的事情,如:加载资源失败:net :: ERR_NETWORK_IO_SUSPENDED

  1. 检查用户的新邮件的收件箱
  2. 检查用户的帐户是否有新的即时消息

然而,如果用户登录,但是INACTIVE(不使用鼠标或按下任何键)约15分钟,当我使用Chrome浏览器“检查元素”时收到以下错误消息:

Failed to load resource: net::ERR_NETWORK_IO_SUSPENDED // (x 5) 
Uncaught Type Error: Cannot read property 'combinedfiletimeinput' of undefined //one of my previously defined form values is now not defined 

此时,用户的新电子邮件数量,新IM数量等变为空白(而之前它们是整数)。用户所要做的就是刷新页面或转到其他页面重新连接,所以这不是一个大问题。

我劈的解决办法是使用JavaScript计时器自动注销用户如果没有任何在15分钟内的下列事件:

  1. 鼠标点击
  2. 鼠标移动
  3. 关键按

有没有办法阻止这种“无法加载资源”的错误发生?

更新:这似乎发生在用户重新启动设备时用户的设备在仍然登录时睡眠/休眠状态。这是当Chrome的Inspect Element,Firebug等可以看到错误信息时。

UPDATE 10/02/2014:现在我已经将五个setTimeout函数压缩成了一个大的setTimeout函数。此外,在名为“combinedfiletimeinput”的输入中保留修改时间的表单已被删除,我现在处理文件修改时间的方式不同。

以下是显示错误的Chrome开发人员工具日志的屏幕截图。我添加了“mysite”来代替我的网站名称和“文件名”来代替实际的文件名。我也列出了外部JavaScript文件的名称,剩下的就是.js(对不起,但我只是想小心:))我剪掉了一些截图,所以文本会足够大读书。

Chrome Screenshot

正如你可以看到的截图,请求处理前三请求确定。然后,我“睡眠”我的设备,然后重新打开设备。这就是接下来的两个请求是错误的地方(红色)。在这两个错误发生后,请求会再次正常处理(黑色文本行,红色文本行之后)。控制台清楚地显示错误消息。

+1

我不认为你可以避免无法加载资源错误。你有没有试图捕捉ajax查询中的错误,以避免未定义的类型错误? – Kesty

+2

@AdamFischer如果您突然断开计算机与Internet的正常连接(例如拔出以太网电缆,关闭WiFi卡),此行为有何不同?我明白这不会导致'ERR_NETWORK_IO_SUSPENDED',但会导致某种错误。从JavaScript代码的角度来看,我很想知道'ERR_NETWORK_IO_SUSPENDED'与正常突然断开的不同之处。如果没有不同,只需等待几秒钟,然后再次尝试请求。 – apsillers

+0

@apillers,你是向我或者凯蒂斯提出这个问题吗?我从来没有按照你的建议尝试过......我可以试一试 –

回答

1

尽管我认为捕捉异常应该是一般治疗,但您可以尝试触发假(鼠标,滚动,键盘)事件,看看是否会阻止Chrome进入“空闲”状态。

堆栈溢出问题How to simulate a mouse click using JavaScript?可能会对您有所帮助。

+1

@ptrk ...如果用户故意休眠或睡觉他/她的设备,该怎么办?您的解决方案可以防止设备因不活动而睡眠 –

+0

约定。在冬眠的情况下,如果一个页面重新加载是所有用户必须做的,然后打开一个隐藏的iframe与相同的网址,然后关闭它应该也可以。您只需要捕获异常并自动执行用户现在手动执行的操作。 – ptrk

+4

强制系统保持清醒通常是不好的做法。在电池供电的设备上,如笔记本电脑和平板电脑,它会不必要地燃烧电池。这也违背了大多数操作系统的应用指南,尽管网页模糊了界限。 – pmont

15

只是在社区的问题下总结我的意见。

经过一番测试,看来,设置阿贾克斯超时 s每个电话是必须的。如果没有超时,NET ::错误(如ERR_NETWORK_IO_SUSPENDED,ERR_INTERNET_DISCONNECTED等将导致Ajax停止执行,并且在计算机唤醒后不会恢复。

的jQuery:

$.ajax({ 
    url: yourURL, 
    timeout: 4000 
}); 

对于XMLHttpRequest(XHR):

xhr.timeout = 4000; 

此外,异常处理是必要的脚本来捕获连接错误,让你的JavaScript代码不会打破由于意外的行为/价值而下降。

即使超时和exeption处理程序,您的应用程序将抛出NET ::错误,但他们会而不是危害您的应用程序;你可以将它们想象成通知

相关问题