Javascript获取ReadableStream不会在缓慢读取时降低网络速度

时间:2018-08-15 21:13:08

标签: javascript fetch-api

下面的示例是一个非常简单的提取代码段,该代码段将启动对大对象的读取并从中读取(实际上,它已被转换并传递给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)下载过多的数据,而这些数据很可能不会被使用。

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

0 个答案:

没有答案