我正在尝试使用 XMLHttpResponse 对象实现彗星风格的长轮询连接。这个想法是保持与服务器的开放连接,该服务器在可用时发送数据(假推送)。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;
我认为问题可能是您不能像这里那样从它自己的事件处理程序(进程)中删除一个对象(xhr)。特别是因为处理程序中的“this”绑定到包含我要删除的对象(xhr)的对象(XHR)。有点圆!
任何人都可以帮忙吗?上面的例子是我能得到的最接近的例子。