Я пытаюсь реализовать кометное длинное соединение с использованием объекта 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), который я пытаюсь удалить.
Вроде круговой!
Кто-нибудь может помочь? Приведенный выше пример является самым близким, который я могу получить.