Javascript fetch ReadableStream在缓慢读取时不会减慢网络速度

Javascript fetch ReadableStream在缓慢读取时不会减慢网络速度,javascript,fetch-api,Javascript,Fetch Api,下面的示例是一个非常简单的fetch片段,它启动对大型对象的fetch并从中读取(实际上它正在被转换并传递给响应对象,但这并不重要) 问题是,即使流只读取2个块,但在Network DevTools中查看时,很明显整个大型对象都会被下载: fetch(“http://ipv4.download.thinkbroadband.com/200MB.zip)然后(响应=>{ const networkreader=response.body.getReader(); networkreader.rea

下面的示例是一个非常简单的fetch片段,它启动对大型对象的fetch并从中读取(实际上它正在被转换并传递给
响应
对象,但这并不重要)

问题是,即使流只读取2个块,但在Network DevTools中查看时,很明显整个大型对象都会被下载:

fetch(“http://ipv4.download.thinkbroadband.com/200MB.zip)然后(响应=>{
const networkreader=response.body.getReader();
networkreader.read()。然后(数据=>{
console.log(“读取”,data.value.length);
});
networkreader.read()。然后(数据=>{
console.log(“读取”,data.value.length);
});
//networkreader.cancel();//不能这样做
});
正如预期的那样,读取工作正常,只返回2个数据块,但在DevTools中,整个200MB的数据正在下载。在流上调用
cancel()
将停止下载,但我不能这样做,因为流将被移交给
响应
对象,它将缓慢地消耗数据、暂停等,并可能在几分钟不活动后取消下载

在现实世界中,当资源是通过分块编码或HTTP/2使用的视频或其他可流化数据时,就会发生这种情况

我能想到的唯一解决办法是使用范围请求,从而限制浏览器(在我的例子中是Chrome)下载太多很可能不会使用的数据


如果我做错了什么,或者这是一个浏览器问题,请让我知道,因为范围请求方法感觉相当混乱。谢谢。

服务器发送尽可能多的响应,浏览器将其缓冲,直到应用程序读取为止。这会导致什么问题?这就是TCP的工作方式。它使事情更加高效,因为如果读者处理数据的速度比发送者发送数据的速度慢,他们很少需要等待数据。@Barmar TCP窗口按预期工作,而不是这里的问题:当我有一个视频消费者连接到一个提取(服务工作者)并且视频没有自动播放(它只读取mp4头)视频使用分块内容编码或HTTP/2的数据流来阻止服务器在初始头之后发送更多数据。但在获取数据流元数据信息后,服务器会丢失数据流元数据信息,并且服务器会继续发送任意数量的GB数据,而chrome会存储这些数据以备将来使用。@Barmar但不幸的是,在查找此“数据以备将来使用”之后被丢弃,因为流被基础传输系统取消。因此,我浪费了大量的流量,这在移动设备上尤其致命。我不是在说TCP窗口。如果应用程序(web浏览器)将数据从网络堆栈读取到自己的缓冲区中,则窗口永远不会关闭。