XMLHttpRequest读取递进数据不起作用?

5

我在使用XMLHttpRequest下载渐进式数据时遇到了问题。状态先是2,然后是3。在状态3之后,它就再也没有被调用过了。我做错了什么?我在某个地方读到需要刷新数据,但我该如何做呢?

这是我的代码:

var xmlHttp = new XMLHttpRequest();
// try to connect to the server
try
{
  // initiate server request
  xmlHttp.open("GET", "http://208.43.121.133:8164/;", true);
  xmlHttp.setRequestHeader("Icy-Metadata", "1");
  xmlHttp.onreadystatechange = function() 
  {
    alert("status: "+xmlHttp.status);
    alert("State: "+xmlHttp.readyState);

    if (xmlHttp.readyState == 3)
    {
      alert(xmlHttp.responseText);
    }
  };
  xmlHttp.send(null);
}
// display an error in case of failure
catch (e)
{
  alert("Can't connect to server:\n" + e.toString());
}

当 readyState 为 3 时,我可以阅读 xmlHttp.responseText 吗?
2个回答

0

问题很可能出在这个部分:

    if(xmlHttp.readyState == 3) {
        alert(xmlHttp.responseText);
    }

原因是xmlRequest尚未完成(当完成时,readyState=4)。当您过早请求responseText时,它会触发错误并阻止代码完成。

所以您需要将其更改为:

if(xmlHttp.readyState == 4) {
    alert(xmlHttp.responseText);
}

事实是,我需要随着数据的到来立即处理它。我不能等到所有数据都到齐再开始处理,因为这是一个连续的数据流,永远不会结束。 - Jona
好的,那不是你应该实现连续数据流的方式。你所要做的是在加载完一部分后,请求下一个数据流的部分。xmlHttp 不适用于连续的数据流。 - Kranu

-4

Kranu 是正确的,当 readyState 为 3 时,你不允许读取 responseText。请参考http://www.davidflanagan.com/2005/08/xmlhttprequestreadystate-3.html

解决方案是一次只发送一条消息。当你接收到一条消息时,只需再进行一次 XHR 请求。这就是 Google 实现服务器推送的方式(过去?)。


谢谢提供链接!更精确的信息...所以我卡住了:( 我示例代码中给出的url链接来自一个广播电台,其中有连续的数据包和元数据...这就是我想要的,元数据...我想解析这些数据...所以JavaScript不提供渐进式下载。:( - Jona
广播电台是否在同一主机内?我猜是的,因为你正在对它进行XHR请求。另一种选择是将URL加载到iframe中,并定期检查iframe的内容。最后,您可以编写一个脚本,在服务器上使用常规套接字连接到广播电台,并向客户端输出JSON消息。 - Ruan Mendes
无论如何,您都无法直接从JavaScript执行此操作,因为它是未经base64编码的二进制数据。 - Ruan Mendes
谢谢Juan...你好像对使用JavaScript处理这些数据的想法不屑一顾...我无法运行PHP脚本:( - Jona
这个解决方案完全是错误的。http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute。 “responseText”属性必须返回运行以下步骤的结果:如果状态不是“LOADING”或“DONE”,则返回空字符串并终止这些步骤。返回文本响应实体主体。 - Wiz
1
哇,-4分,希望其中一个投反对票的人能解释一下这个答案有什么问题。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接