javascript - 缓慢读取时,Javascript fetch ReadableStream 不会减慢网络速度
问题描述
下面的示例是一个非常简单的提取片段,它启动对一个大对象的提取并从中读取(实际上它正在被转换并传递给一个Response
对象,但这并不重要)。
问题是即使流只读取了 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)下载这么多很可能不会使用的数据。
如果我做错了什么或者这是浏览器问题,请让我知道,因为范围请求方法感觉相当混乱。谢谢你。
解决方案
推荐阅读
- c++ - 恢复由 NtCreateProcessEx 创建的进程
- python - 在javascript中为Django模板变量赋值
- c++ - 在现代 OpenGL 中显示多个对象的问题
- javascript - 在 Vega-Lite 中进行枢轴变换后动态捕获值
- c++ - 分段错误11:在这种排序和搜索问题中
- sql - 等于操作不适用于时间戳列 postgresql
- mongodb - 基于查找逻辑的MongoDB预存储集字段
- android - Android 应用程序不断抛出 java NullPointerException 并崩溃
- google-maps - Flutter Google Maps - 为什么我在 Google Maps 中看不到我的标记?
- kubernetes - 在受限集群中创建 kubernetes 仪表板,在该集群中您被禁止使用角色、角色绑定等,并且在命名空间之外无权访问