【问题标题】:getJSON's fail event not being called when internet drops互联网掉线时未调用getJSON的失败事件
【发布时间】:2013-04-06 05:43:40
【问题描述】:

我在两台计算机上 24/7 运行一个网页。一台计算机运行IE8,另一台运行IE9。此网页上有一个 JavaScript 计时器,它运行 $.getJSON 以检索 cross-domain JSON 对象。 $.getJSON 在正常情况下可以完美运行,但是其中一台计算机上的 Internet 连接可能会暂时中断。由于我使用$.getJSON 来检索网页的新内容,因此如果互联网暂时中断,则会显示旧内容。

我的问题是,如果在调用 $.getJSON 时互联网出现故障,我假设 $.getJSONfail 事件会触发。在这种情况下,将设置一个新计时器以尝试在 X 分钟内检索JSON(它永远不会停止尝试)。对此进行测试时,我禁用了 Internet 连接,但 fail 事件中的代码没有触发。

fail在没有网络连接的情况下会不会被调用?如果是这样,您会建议什么来防止我的 JavaScript 在互联网出现故障时永久停止?

(我查看的一种方法是在 JSON 调用之前检查互联网连接,但我读过 window.navigator.onLine 是不可靠的,我找不到任何其他解决方案)

【问题讨论】:

标签: javascript jquery json internet-explorer cross-domain-policy


【解决方案1】:

getJSON 只是 ajax 的简写,已经设置了一些值。 ajax 有一个 timeout 选项。这可能是最可靠的选择(但显然不会立即响应网络故障)。我个人会将它与您可以找到的用于确定网络状态的任何检查结合起来。

$.ajax({
    dataType: "json",
    url: url,
    data: data,
    success: success,
    timeout: 10000 // 10 seconds
});

http://api.jquery.com/jQuery.getJSON/

【讨论】:

  • 实际上,在您的具体情况下,只需将超时设置为您想要的任何重试间隔,并让错误处理程序直接重试请求(如果错误是超时),或者使用setTimeout('tryAgainFunction()',0) (不确定 jQuery 内部是如何工作的,但没有它你可能会得到不断增加的内存占用)。
  • 为什么要让tryAgainFunction() 超时?
  • 与变量作用域有关。据我了解,function a(){var i;a()} 将在循环时创建越来越多的i 变量,但function a(){var i;setTimeout('a()',0)} 将只有最后一个变量(使用引号将被调用函数放入不继承范围的eval 环境中变量)。 function a(){var i;setTimeout(a,0)} 创建更多 i 变量。是否需要取决于 jQuery 内部如何处理。
  • @noahnu 你没有使用 JSONP 或脚本请求,所以不用担心。
  • 在这种情况下,我不认为setTimeout(..., 0) 是必要的,因为error 处理程序将被“新”调用堆栈调用——调用堆栈不会包含调用的代码$.ajax().
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
相关资源
最近更新 更多