下面的示例是一个非常简单的提取代码段,该代码段将启动对大对象的读取并从中读取(实际上,它已被转换并传递给Response
对象,但这并不重要)。 / p>
问题在于,即使流仅读取2个块,在Network DevTools中查看时,很明显,整个大对象也已下载:
fetch("http://ipv4.download.thinkbroadband.com/200MB.zip").then(response => {
const networkreader = response.body.getReader();
networkreader.read().then(data => {
console.log("read", data.value.length);
});
networkreader.read().then(data => {
console.log("read", data.value.length);
});
// networkreader.cancel(); // can't do that
});
按预期,读取有效,并且仅返回2块数据,但是在DevTools中,整个200MB的数据正在下载。在流上调用cancel()
会停止下载,但由于流已移交给Response
对象,它将缓慢消耗数据,暂停等并取消它,因此我无法这样做。可能在闲置几分钟后。
在现实世界中,当资源是视频或其他可通过分块编码或HTTP / 2使用的流数据时,就会发生这种情况。
我能想象的唯一解决方法是使用范围请求,从而限制浏览器(在我的情况下为Chrome)下载过多的数据,而这些数据很可能不会被使用。
如果我做错了什么,或者这是浏览器问题,请让我知道,因为范围请求方法感觉很混乱。谢谢。