4

我有一个 javascript web 应用程序设置为使用 .net 服务器的长轮询,使用 ajax 调用:

var _listenTimeout = 5 * 60 * 1000;
//...
$.ajax({
      type: "GET",
      url: url,
      async: true,
      cache: false,
      dataType: "jsonp",
      timeout: _listenTimeout,
      success: callback
});

但是,当页面打开一段时间后,对服务器的请求会停止响应。它似乎处于一种不确定状态,数据包被卡在 Web 浏览器之间并被从网络发送到服务器。

我已经挖掘了,我知道一些事情:

  • 请求被发送是因为它显示在 chrome web 开发人员网络选项卡(也是 chrome://net-internals)和 firebug 上。请求的状态始终处于挂起状态,它只是停滞在该状态。
  • 请求 url 是正确的,因为通过发送相同的 url 会curl返回立即响应。
  • 它没有离开我的网络,因为没有使用wireshark检测到任何数据包。服务器日志(以及那一侧的wireshark)也没有显示任何内容。

奇怪的是,有时它会偶尔工作,但会延迟几分钟,即浏览器网络日志检测到请求得到响应(在我的情况下为 204),wireshark 检测到正在发送的请求(并在服务器端)。浏览器和wireshark的延迟相同,即发出请求,发生延迟,然后chrome检测响应,wireshare检测发送的数据包。

页面的干净刷新也解决了这个问题,几乎立即发生相同的请求/响应(使用相关的浏览器网络和 wireshark 日志)。

我已经在 Chrome 21.0.1180.89 和 Firefox 14.01 上尝试过。

是否有某种浏览器队列被 ajax 请求阻塞在浏览器中?或者可能有太多并发请求?暂时不知道...

4

1 回答 1

0

$.ajax 不会发出定期请求。timeout 选项指定发出实际请求而不是轮询的延迟。在这里阅读。http://api.jquery.com/jQuery.ajax/。这就是为什么您只看到一个 ajax 请求的原因。如果您想要手动操作,您必须使用 setTimeout javascript 方法来完成。

您可以在成功和错误回调中调用 setTimeout,以便摆脱并发的 ajax 请求。

于 2012-09-21T20:28:18.387 回答