Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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 使用AJAX或WebSocket访问部分响应?_Javascript_Ajax_Http_Websocket - Fatal编程技术网

Javascript 使用AJAX或WebSocket访问部分响应?

Javascript 使用AJAX或WebSocket访问部分响应?,javascript,ajax,http,websocket,Javascript,Ajax,Http,Websocket,我使用一些客户端JavaScript代码通过HTTP GET从Web服务器中提取大量JSON数据。数据量可能很大,比如50MB。这是在局域网上,所以问题不大,但仍然需要10秒钟左右 为了使我的界面更具响应性,我希望将响应分块处理,在UI中显示可用的数据(例如,每MB或每秒)。浏览器兼容性不是问题;只要能在最新的Chrome和Firefox上运行,一切都会好起来的。但是,我无法修改服务器代码 使用XMLHttpRequest、WebSockets或其他一些我从未听说过的技术,有可能做到这一点吗 X

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

为了使我的界面更具响应性,我希望将响应分块处理,在UI中显示可用的数据(例如,每MB或每秒)。浏览器兼容性不是问题;只要能在最新的Chrome和Firefox上运行,一切都会好起来的。但是,我无法修改服务器代码

使用XMLHttpRequest、WebSockets或其他一些我从未听说过的技术,有可能做到这一点吗

XMLHttpRequest.responseText
在状态为加载时不显式为空:

responseText属性必须返回运行以下步骤的结果:

  • 如果状态为not LOADING或DONE,则返回空字符串并终止这些步骤
  • 返回文本响应实体体
  • 但我认为缓冲将在过程中的不同阶段发生,因此,如果我设置一个计时器来定期轮询
    responseText
    ,它会起作用吗

    据我所知,WebSocket在服务器端也需要一个特殊的协议,所以这些协议已经过时了

    限制:我无法修改服务器代码。

    希望将此作为注释发布,但注释文本区域有点限制

    服务器现在是以块的形式发送数据,还是一个连续的流?如果将处理程序添加到
    xmlHttpRequestInstance.onreadystatechange
    中,它多长时间触发一次?如果
    xmlHttpRequestInstance.readystate
    的值为3,则可以获取
    xmlHttpRequestInstance.responseText的当前值并跟踪长度。下次readystate更改时,您可以通过从该点开始获取所有新数据来获取最新数据

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

    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。

    这可能不是一个可行的解决方案,但您可以制作第二台服务器,将数据从第一台服务器分块获取(Node.js可以非常容易地用于此),然后在接收到每个分块时立即使用WebSocket将数据发送给客户端。Node.js也有WebSockets库,所以应该不会太难。这是一个有趣的想法,但有几个原因使我无法轻松完成此操作。不幸的是,jQuery不允许我连接一个
    onreadystatechange
    处理程序。但我怀疑它是否会起作用,因为从
    加载
    加载
    可能不算作
    readyState
    更改。当然,jQuery不会让您连接到
    onreadystatechange
    处理程序。为此,您必须绕过jQuery。它不在规格中-嘿嘿!这就是为什么人们觉得这(较旧的Comet技术:HTTP长轮询和HTTP流)是一种黑客行为。你可以在这里看到一个例子:这里有更多的细节:“托马斯,你应该考虑接受这个答案,或者告诉我们为什么它不能解决你的问题。”我不记得。因为这是一个业余项目,我可能没有时间尝试这个。我相信你的话。绿色支票!