不使用jQuery的简单XHR长轮询

3
我正在尝试编写一个简单的长轮询系统(是的,我不想使用任何现成的脚本,因为我想从中学习)。我正在使用Node服务器,可以轻松地将数据返回到客户端而无需调用result.end();。客户端应该如何实现呢?我只是想将其作为IE<=9用户的一个简单但不太好的备选方案,因为更好的浏览器可以使用快速且易于使用的WebSocket。

简而言之,如何在纯JS中进行长轮询而不使用jQuery或其他框架?(或者是否有比长轮询更好的方法)。

1个回答

2
以下内容是否符合您的要求?
  var xhr = new XMLHttpRequest();
  xhr.responseType = 'blob';//or 'text', 'json', ect. there are other types. 
  xhr.timeout = 60000;//milliseconds until timeout fires. (1 minute)
  xhr.onload = function(e2){
    var blob = xhr.response;
    //handle response data
  }
  xhr.ontimeout = function(){
    //if you get this you probably should try to make the connection again.
    //the browser should've killed the connection. 
  }
  xhr.open('GET', "/path/to/URL.cmd?param1=val1&param2=val2", true);
  xhr.send();

我认为timeout属性是使长轮询工作的关键,更多信息请参见规范,同一文档中还有有关responseType的更多信息。如果未指定超时时间,则默认值为零。


所以这是针对响应的,因为我已经阅读过了,但我想知道当我的应用程序准备好数据时,如何通过xhr发送数据,例如多次调用xhr.send(data),或者这不可能吗?(这样我每次有数据时都需要打开一个新的xhr或将数据排队并在x秒后发送它)。就像在node中我可以多次调用.write,然后调用.end。 - MarijnS95
也许,我已经认真考虑过了。我从未尝试过这个,但是有一个部分状态(xhr.readyState == 3),我也不太了解浏览器的实现。话虽如此,有一个名为响应主体的arrayBuffer,可能包含部分数据,直到readyState状态完成。因此,您可以从服务器多次进行.write调用,并将其读取和处理为部分段。您可以增加超时毫秒数,在ontimeout中重新调用相同的请求。 - Arthur Weborg
这已经是可以实现的,我的意思是,当XHR打开时(当两端都没有关闭/结束它),我可以在服务器上多次调用.write,但我的问题是,我应该如何从客户端做到这一点。 - MarijnS95
1
@ArtyMcFly 不要忘记为xhr.open的路径参数添加闭合双引号。 - James M. Lay

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