2013-11-27 4 views
0

Не путайте 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(); 
    } 
} 

Но это действительно отстой. Такой вывод трудно отлаживать и использует много памяти.

ответ

0

У меня была такая же проблема, как у вас.

Я видел, что браузер не запускает событие onprogress, если только они не получили минимальный объем данных. Я точно не знаю, что это за значение для всех браузеров. Но для моего случая я добавил пустое пространство, поэтому первое сообщение имеет минимальный размер 2048 символов.

Я использую что-то же просто, как следующий (PHP)

if (strlen($data) < 2048) { 
    $data = str_pad($data, 2048 - strlen($data)); 
} 

Обратите внимание, что ваш веб-сервер может раздеть дополнительные пробелы, поэтому убедитесь, что он не делает, что если вы не видели дополнительные белые пробелы в браузере.

Смежные вопросы