Javascript 实现自重置XMLHttpRequest对象

Javascript 实现自重置XMLHttpRequest对象,javascript,ajax,xmlhttprequest,Javascript,Ajax,Xmlhttprequest,我正在尝试使用XMLHttpResponse对象实现comet样式的长轮询连接。 其想法是保持与服务器的开放连接,该服务器在数据可用时发送数据(假装推送)。一旦XHR对象完成,我就需要生成一个新对象来等待任何新数据 下面是一段代码,它概述了一个有效的解决方案,但正如注释所说,只是因为超时,我需要消除超时 window.onload = function(){ XHR.init(); } XHR = { init: function() { this.xhr =

我正在尝试使用XMLHttpResponse对象实现comet样式的长轮询连接。 其想法是保持与服务器的开放连接,该服务器在数据可用时发送数据(假装推送)。一旦XHR对象完成,我就需要生成一个新对象来等待任何新数据

下面是一段代码,它概述了一个有效的解决方案,但正如注释所说,只是因为超时,我需要消除超时

window.onload = function(){
    XHR.init();
}


XHR = {
    init: function() {
        this.xhr = new XMLHttpRequest();
        this.xhr.open( "GET", "proxy.php?salt="+Math.round( Math.random()*10000 ), true );
        this.xhr.onreadystatechange = this.process.bind( this );
        this.xhr.send( null );
    },
    process: function() {
        if( this.xhr.readyState == 4 ) {

            // firebug console
            console.log( this.xhr.responseText );

            // ** Attempting to create new XMLHttpRequest object to
            // replace the one that's just completed
            // doesn't work without the timeout
            setTimeout( function() { this.init() }.bind( this ), 1000 );
        }
    }
}


Function.prototype.bind = function( obj ) {
    var method = this;
    return function() {
        return method.apply( obj, arguments );
    }
}


// proxy.php - a dummy that keeps the XHR object waiting for a response
<?php
$rand = mt_rand( 1, 10 );
sleep( $rand );
echo date( 'H:i:s' ).' - '.$rand;
window.onload=function(){
XHR.init();
}
XHR={
init:function(){
this.xhr=newXMLHttpRequest();
this.xhr.open(“GET”,“proxy.php?salt=”+Math.round(Math.random()*10000),true);
this.xhr.onreadystatechange=this.process.bind(this);
this.xhr.send(空);
},
进程:函数(){
if(this.xhr.readyState==4){
//萤火虫控制台
log(this.xhr.responseText);
//**正在尝试创建新的XMLHttpRequest对象以
//更换刚刚完成的一个
//没有超时就不能工作
setTimeout(function(){this.init()}.bind(this),1000);
}
}
}
Function.prototype.bind=函数(obj){
var方法=此;
返回函数(){
返回方法.apply(对象、参数);
}
}
//php-使XHR对象等待响应的虚拟对象

你所做的就是有效地进行轮询,为什么要让它变得比需要的更复杂,而只是每隔几秒钟进行一次轮询?或者每一秒钟,你真正节省了多少时间,这是否真的那么重要,如果你有很多用户,你将在服务器端占用大量的套接字。

你所做的是有效地轮询,为什么要使它比需要的更复杂,并且只需每隔几秒钟轮询一次?或者每秒钟,你真正节省了多少时间,这是否真的那么重要,如果你有很多用户,你将在服务器端占用大量的套接字。

但要真正尝试并回答你的问题,删除不需要的东西的方法是设置一个计时器来调用执行删除操作的函数,这样,被删除的不是它本身。

但要真正尝试并回答您的问题,删除不存在的内容的方法是设置一个计时器来调用执行删除的函数,这样,被删除的不是它本身。

@stu

在这个应用程序中,响应时间是关键——事实上,重要的是所有客户端同时更新(或尽可能接近更新)

断开连接的数量将相当有限,约为50max,更改之间的间隔可能为几分钟

如果使用轮询,它将需要非常短的100ms,这将导致大量不必要的请求(对于我拼凑的小php socket服务器来说,这将是非常昂贵的——我知道,我知道python对服务器来说会更好,但我不太清楚)

@stu

在这个应用程序中,响应时间是关键——事实上,重要的是所有客户端同时更新(或尽可能接近更新)

断开连接的数量将相当有限,约为50max,更改之间的间隔可能为几分钟


如果使用轮询,它需要非常短~100ms,这将导致大量不必要的请求(对于我拼凑的小php socket服务器来说,这将是非常昂贵的——我知道,我知道python对服务器来说会更好,但我不太清楚)

您可能根本不应该为此使用XMLHTTPRequest

几年前,早在人们知道XMLHTTPRequest之前,我就创建了一个聊天程序,用于普通浏览器。聊天窗口位于一个框架中,其中数据来自一个从未结束的cgi脚本。只要有新数据,我就发送它,并立即显示在客户端

我想你今天可以用类似的东西:

  • 在页面中创建一个函数来执行更新
  • 创建IFRAME,如果需要,可以使其不可见
  • 将IFRAME的源设置为生成数据的脚本
  • 数据可以封装在脚本标记中。如果我没记错的话,浏览器需要在尝试评估脚本标记之前拥有脚本标记的全部内容。调用您的更新函数:

    <script type="text/javascript">myupdate("mydata");</script> 
    
    myupdate(“mydata”);
    
  • 即使您没有要发送的内容,也要每隔5秒左右发送一个空格,以重置浏览器的超时
  • 如果我没记错的话,您必须在事务开始时发送大约1K的数据,以填充浏览器中的预取缓冲区(在今天的浏览器中,这可能必须增加)

    • 您可能根本不应该为此使用XMLHTTPRequest

      几年前,早在人们知道XMLHTTPRequest之前,我就创建了一个聊天程序,用于普通浏览器。聊天窗口位于一个框架中,其中数据来自一个从未结束的cgi脚本。只要有新数据,我就发送它,并立即显示在客户端

      我想你今天可以用类似的东西:

      • 在页面中创建一个函数来执行更新
      • 创建IFRAME,如果需要,可以使其不可见
      • 将IFRAME的源设置为生成数据的脚本
      • 数据可以封装在脚本标记中。如果我没记错的话,浏览器需要在尝试评估脚本标记之前拥有脚本标记的全部内容。调用您的更新函数:

        <script type="text/javascript">myupdate("mydata");</script> 
        
        myupdate(“mydata”);
        
      • 即使您没有要发送的内容,也要每隔5秒左右发送一个空格,以重置浏览器的超时
      • 如果我没记错的话,您必须在事务开始时发送大约1K的数据,以填充浏览器中的预取缓冲区(在
          function getData() {
            $.getJSON(someUrl, gotData);
          }
        
          // Whenever a query stops, start a new one.
          $(document).ajaxStop(getData, 0);
          // Start the first query.
          getData();
        
        init: function() {
                xhr = null;
                this.xhr = new XMLHttpRequest();
                this.xhr.open( "GET", "proxy.php?salt="+Math.round( Math.random()*10000 ), true );
                this.xhr.onreadystatechange = this.process.bind( this );
                this.xhr.send( null );
            },