【问题标题】:Simple XHR long polling without jQuery没有 jQuery 的简单 XHR 长轮询
【发布时间】:2014-03-14 09:47:55
【问题描述】:

我正在尝试编写一个简单的长轮询系统(是的,我确实想使用任何现成的 scipt,因为我想从中学习)。我正在使用节点服务器,无需调用result.end(); 即可轻松地将数据通过管道传输/写回客户端。我应该如何做这个客户端?我只是希望这对于使用 ie

长问题短:如何在没有 jQuery 或其他框架的普通 JS 中进行长轮询? (或者有没有比长轮询更好的方法)。

【问题讨论】:

    标签: javascript node.js http long-polling


    【解决方案1】:

    以下是您要查找的内容吗?

      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 属性是使长轮询工作的关键,更多信息请参阅spec,在同一文档中有更多关于 responseType 的信息。如果没有指定超时时间,则默认为零。

    【讨论】:

    • 所以这是我已经阅读过的响应,但我想知道当我的应用程序准备好数据时,我将如何通过 xhr 发送数据,比如调用 xhr.send(数据)多次,还是不可能? (这样我每次有数据时都需要打开一个新的 xhr 或排队数据 eland 发送非常 x 秒)。所以就像在节点中我可以多次调用 .write 并在它调用之后调用 .end
    • 也许,我一直在考虑。我从来没有玩过这个,但是有一个部分状态(xhr.readyState == 3)我也不太了解它的浏览器实现。那说有一个arrayBuffer called the responsive body 可能包含部分数据,直到readyState 状态完成。因此,您可以从服务器多次执行 .write 调用,并在部分段中读取和处理它。您可以增加超时毫秒,召回相同的请求ontimeout
    • 这已经是可能的了,我的意思是,当 XHR 打开时,(当两端都没有关闭它/结束它时)我可以在 服务器上多次调用 .write,但我的问题是,我应该如何从客户端做这样的事情。
    • @ArtyMcFly 不要忘记 xhr.open 的路径 arg 的右双引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2011-04-07
    • 2015-11-20
    • 1970-01-01
    • 2013-02-28
    • 2013-09-13
    • 2011-09-19
    相关资源
    最近更新 更多