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
   243   244   245   246   247   248   249   250   251   252   253