Page 248 - Web性能权威指南
P. 248
不过,也不要彻底不抱希望。没有把流作为 XHR 的第一类场景考虑是一个公认的
缺漏,因此目前正有人在积极地解决这个问题:
Web 应用必须有能力获得并操作各种形式的数据,包括随着时间推移逐渐可
用的一系列数据。本规范定义了流的基本表示法、流触发的错误,以及通过
编程方式读取和创建流的方式。
——W3C Streams API
XHR 加上 Streams API 可以让浏览器支持高效的 XHR 流。可是,Streams API 目前
还处于研讨阶段,没有一个浏览器支持它。因此,我们暂时就没有别的办法了,对
吧?嗯,也不完全对。如前所述,通过 XHR 实现流式上传还不行,通过 XHR 实现
流式下载却得到了浏览器有限的支持:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/stream');
xhr.seenBytes = 0;
xhr.onreadystatechange = function() { ➊
if(xhr.readyState > 2) {
var newData = xhr.responseText.substr(xhr.seenBytes); ➋
// 处理 newData
xhr.seenBytes = xhr.responseText.length; ➌
}
};
xhr.send();
➊ 预订状态和进度通知
➋ 从部分响应中提取新数据
➌ 更新处理的字节偏移量
这个例子在多数现代浏览器中都可以运行,但性能并不理想。另外,还有很多关于
实现的问题和注意事项。
• 我们是手工跟踪看到的字节的偏移量,然后再手工切分数据:responseText 则缓
冲了完整的响应!对于少量数据传输而言,这不是问题。但如果下载的数据很大,
特别是在内存十分有限的设备比如手机上,这就是问题了。释放缓冲数据的唯一
方式就是完成当前请求,并且打开一个新请求。
• 部分响应只能通过读取 responseText 属性获取,因此也就只能局限于文本数据了。
没有办法部分读取二进制数据的响应。
XMLHttpRequest | 235