Не путайте XMLHttprequest.onprogress
с XMLHttprequest.upload.onprogress
.XMLHttpreques onprogress event не называется
Я использую это событие XMLHttprequest.onprogress
для обработки ввода сервера до завершения запроса на длительный опрос. На сервере, сценарий может выглядеть так:
while(condition && timeout condition) {
if(data available) {
echo $data;
flush();
}
}
Javascript OnProgress событие выглядит следующим образом:
function onprogressCallback() {
//Start at the current position in the input, anything before has already been sent to onData()
var seektmp = seeker;
//Loop through the input and seek delimiters
while(seektmp<_this.http.responseText.length&&!forcedDisconnect) {
if(_this.http.responseText[seektmp]==_this.delimiter) {
//If a delimiter has been found, send the fragment before to onData
var data = _this.http.responseText.substr(seeker,seektmp-seeker);
//Only call on nonempty data, empty data are used to keep onprogress event running
if(data!="")
_this.onData(data);
//Skip the original seeker to the end of data that has been read (+1 for delimiter)
//console.log("DATA!: '",_this.http.responseText.substr(seeker,seektmp-seeker),"'");
seeker=seektmp+1; //todo: +delimiter size, instead of just 1
}
//iterate 1 character, until the end of data
seektmp++;
}
}
_this
в коде выше reffers этой ссылке из пространства имен, содержащего эту функцию. _this.http
- http-запрос, который я использую для длительного опроса.
поручаю это один к httpreques объекта:
this.http.onprogress = onprogressCallback;
Теперь проблема:
OnProgress enent является не вызывается, когда я выход небольшой суммой данных один раз. Данные хранятся в каком-то буфере, и их не удается достичь, однако я вижу их в firebug.
Однако, если я продолжу распространение спама браузер бесполезных данных, например, нагрузка \n
, она работает, как предполагается:
while(condition && timeout condition) {
if(data available) {
echo $data."\n";
flush();
}
else {
echo "\n"; //Endless stream of \n keeps browser calling the onprogress event
flush();
}
}
Но это действительно отстой. Такой вывод трудно отлаживать и использует много памяти.