请勿将XMLHttprequest.onprogress
与XMLHttprequest.upload.onprogress
混淆。
我使用此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
从包含此函数的命名空间引用此引用。 _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 :(得分:0)
我和你的问题一样。
我能看到的是,除非收到最少量的数据,否则浏览器不会触发onprogress事件。我不确定所有浏览器的价值是什么。但就我而言,我添加了空格,因此第一条消息的最小大小为2048个字符。
我使用的东西很简单,如下所示(PHP)
if (strlen($data) < 2048) {
$data = str_pad($data, 2048 - strlen($data));
}
请注意,您的网络服务器可能会删除额外的空白区域,因此如果您在浏览器中没有看到其他空格,请确保它没有这样做。