【问题标题】:Accessing partial response using AJAX or WebSockets?使用 AJAX 或 WebSockets 访问部分响应?
【发布时间】:2011-12-18 15:24:53
【问题描述】:

我正在使用一些客户端 JavaScript 代码通过 HTTP GET 从网络服务器中提取大量 JSON 数据。数据量可能很大,例如 50 MB。这是在局域网上,所以问题不大,但仍然需要十秒钟左右。

为了使我的界面更具响应性,我想以块的形式处理响应,并在数据可用时立即在 UI 中显示数据(比如说,每 MB 或每秒)。浏览器兼容性不是问题;只要它适用于最新的 Chrome 和 Firefox 就可以了。但是,我无法修改服务器代码。

是否可以使用 XMLHttpRequest 或 WebSockets 或其他我没听说过的技术来做到这一点?

XMLHttpRequest.responseText 在状态为LOADING 时未明确为空:

responseText 属性必须返回运行这些步骤的结果:

  1. 如果状态不是 LOADING 或 DONE,则返回空字符串并终止这些步骤。
  2. 返回文本响应实体正文。

但我想缓冲会在沿途的各个阶段发生,所以如果我设置一个计时器来定期轮询responseText,它会起作用吗?

据我所知,WebSockets 在服务器端也需要一个特殊的协议,所以这些都没有了。

限制:我不能修改服务器代码。

【问题讨论】:

  • 这可能不是一个可行的解决方案,但您可以创建第二个服务器,从第一个服务器中获取数据块(Node.js 可以很容易地用于此),然后发送使用 WebSockets 立即将每个块接收到客户端时的数据。还有适用于 Node.js 的 WebSockets 库,所以应该不会太难。
  • 有趣的想法,但我不能轻易做到这一点有几个原因。

标签: javascript ajax http websocket


【解决方案1】:

想将此作为评论发布,但评论文本区域有点限制

服务器现在是分块发送数据还是一个连续的流?如果您将处理程序添加到xmlHttpRequestInstance.onreadystatechange,它多久触发一次?如果xmlHttpRequestInstance.readystate 的值为3,那么您可以获得xmlHttpRequestInstance.responseText 的当前值并跟踪长度。下次准备就绪状态发生变化时,您可以通过从该点开始获取所有新数据来获取最新数据。

我没有测试过以下内容,但希望它足够清楚:

var xhr = new XMLHttpRequest();
var lastPos = 0;
xhr.onreadystatechange = function() {
  if(xhr.readystate === 3) {
    var data = xhr.responseText.substring(lastPos);
    lastPos = xhr.responseText.length;

    process(data);
  } 
};
// then of course do `open` and `send` :)

这当然依赖于onreadystatechange 事件触发。这适用于 IE、Chrome、Safari 和 Firefox。

【讨论】:

  • 不幸的是,jQuery 不允许我连接 onreadystatechange 处理程序。但我怀疑它是否会起作用,因为从LOADINGLOADING 可能不算作readyState 的变化。 spec 也没有提到任何此类事件被调度。
  • 是的,jQuery 不会让你连接到 onreadystatechange 处理程序。为此,您必须绕过 jQuery。它不在规范中 - 呵呵!这就是为什么人们觉得这(旧的 Comet 技术:HTTP Long-Polling 和 HTTP Streaming)是一种 hack。您可以在此处查看实际示例:leggetter.co.uk/stackoverflow/7213549 并在此处查看更多详细信息:stackoverflow.com/questions/7213549/…
  • @Thomas 你应该考虑接受这个答案或者告诉我们为什么它没有解决你的问题。
  • @BenjaminGruenbaum 我不记得了。由于这是一个业余项目,我可能没有时间尝试这个。
  • 我相信你的话。绿色检查!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多