当前位置: 首页 > 面试题库 >

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

归泽宇
2023-03-14
问题内容

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

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

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

XMLHttpRequest.responseText当状态为时,它不是显式为空LOADING

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

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

但是我认为缓冲会在此过程的各个阶段进行,所以如果我设置了一个定期轮询的计时器,它将起作用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中运行。



 类似资料:
  • 在服务器端,我正在使用一个HTTP API,它以页面形式返回结果。如中所示,响应包含x个结果,如果有超过0的结果,我可以再次调用它以获得下一个x个结果。x可以任意选择直到API的最大页面大小。 现在,我想要在WebSocket上高效地流式传输全套结果,而不会使它不堪重负(施加背压)。最初,我构建了整个resultset,然后从中创建了一个源代码: 这样可以工作,WebSocket客户机以其最大速度

  • 我正在使用Redux工具包的反应,但我正在unbale访问响应头

  • 问题内容: 什么是空指针异常(),什么原因导致它们? 可以使用哪些方法/工具确定原因,以阻止异常导致程序过早终止? 问题答案: 声明引用变量(即对象)时,实际上是在创建指向对象的指针。考虑以下代码,您在其中声明基本类型的变量: 在此示例中,变量是an ,Java会为您初始化它。在第二行为其分配值时,您的值将写入所指的存储位置。 但是,当您尝试声明引用 类型时 ,会发生一些不同的事情。采取以下代码:

  • 问题内容: 我最近开始用PHP编写大量AJAX支持的脚本代码,事实是,也可以直接使用AJAX调用访问的文件,如何禁用它? 问题答案: 您不能可靠地阻止这种情况的发生。真正的关键是不要将某人直接访问此文件作为安全问题-计划这样做是可能的,您将处于一个安全得多的地方。 有人可能会推荐看起来像这样(或相似)的代码: 但是,事实是HTTP标头很容易被欺骗,并且不是保护代码的手段。在一段时间的繁忙站点上进行

  • 我正在尝试一些简单的方法,使用FetchAPI从应用程序前端发出请求,如下所示 我在服务器上像这样处理这个请求, 但是,当我尝试访问前端console.log(响应)上的数据时,会得到以下对象 响应主体为空。我想那就是数据显示的地方?如何有效地从服务器传递数据?